当前位置: 首页 > 编程日记 > 正文

Java动态加载一个类的几种方法以及invoke

一.加载一个类的几种方法

接口

IUser

package org.me.javaapp;/**** @author Administrator*/
public interface IUser {}

User.java

/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package org.me.javaapp;public class User implements IUser{private String  name;private int  id;/*** @return the name*/public String getName() {return name;}/*** @param name the name to set*/public void setName(String name) {this.name = name;}/*** @return the id*/public int getId() {return id;}/*** @param id the id to set*/public void setId(int id) {this.id = id;}
}

主类

    public static void main(String[] args) throws ClassNotFoundException{  try{Class c1=Class.forName("org.me.javaapp.User");Class c2=User.class;Object o1=c1.newInstance();Object o2=c2.newInstance();User u1=new User();Class c3=u1.getClass();/*this.getClass.getClassLoader();// 使用当前类的ClassLoader  Thread.currentThread().getContextClassLoader();            // 使用当前线程的ClassLoader  ClassLoader.getSystemClassLoader(); // 使 用系统ClassLoader,即系统的入口点所使用的ClassLoader。(注意,system ClassLoader与根 ClassLoader并不一样。JVM下system ClassLoader通常为App ClassLoader)  */ClassLoader clo=Thread.currentThread().getContextClassLoader();Class c4=clo.loadClass("org.me.javaapp.User");Field[] fs = c1.getDeclaredFields();for(Field field:fs){  System.out.println("获得属性的修饰符,例如public,static等等 >>"+Modifier.toString(field.getModifiers()));System.out.println("属性的类型的名字 >>"+field.getType());System.out.println("属性的名字 >>"+field.getName());}Method[] ms = c1.getDeclaredMethods();for(Method field:ms){  System.out.println("获得方法的修饰符,例如public,static等等 >>"+Modifier.toString(field.getModifiers()));System.out.println("方法的参数个数 >>"+field.getParameterCount());System.out.println("方法的名字 >>"+field.getName());}System.out.println("c1的父类>>"+c1.getSuperclass());Class[] cs=c1.getInterfaces();for(Class field:cs){  System.out.println("接口的名字 >>"+field.getName());}System.out.println(">>>>>>>>>>>");}catch (Exception ex){System.out.println(ex.toString());}}

输出:

获得属性的修饰符,例如public,static等等 >>private
属性的类型的名字 >>class java.lang.String
属性的名字 >>name
获得属性的修饰符,例如public,static等等 >>private
属性的类型的名字 >>int
属性的名字 >>id
获得方法的修饰符,例如public,static等等 >>public
方法的参数个数 >>0
方法的名字 >>getName
获得方法的修饰符,例如public,static等等 >>public
方法的参数个数 >>0
方法的名字 >>getId
获得方法的修饰符,例如public,static等等 >>public
方法的参数个数 >>1
方法的名字 >>setName
获得方法的修饰符,例如public,static等等 >>public
方法的参数个数 >>1
方法的名字 >>setId
c1的父类>>class java.lang.Object
接口的名字 >>org.me.javaapp.IUser

参考:JAVA中的反射机制

获取方法,和构造方法,不再详细描述,只来看一下关键字:
方法关键字
含义
getDeclaredMethods()
获取所有的方法
getReturnType()
获得方法的放回类型
getParameterTypes()
获得方法的传入参数类型
getDeclaredMethod("方法名",参数类型.class,……)
获得特定的方法
 
 
构造方法关键字
含义
getDeclaredConstructors()
获取所有的构造方法
getDeclaredConstructor(参数类型.class,……)
获取特定的构造方法
 
 
父类和父接口
含义
getSuperclass()
获取某类的父类
getInterfaces()
获取某类实现的接口


ClassLoader 详解及用途

ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象。


java中的反射总结 【举例不错,很全面】


二.Invoke

一个方法可以生成多个Method对象,但只有一个root对象,主要用于持有一个MethodAccessor对象,这个对象也可以认为一个方法只有一个,相当于是static的,因为Method的invoke是交给MethodAccessor执行的。

package org.me.javaapp;public class Child extends Person{public void say(String s) {System.out.println("Hello invork>>>"+s);}public void add(int a,int b) {a+=b;System.out.println("a+b="+a);}
}

invoke调用

package org.me.test;import java.lang.reflect.Method;
import org.junit.Test;public class TestInvoke {@Testpublic void testSingleton() throws Exception {Class<?> clz = Class.forName("org.me.javaapp.Child");Object o = clz.newInstance();Method m = clz.getMethod("add", int.class,int.class);m.invoke(o, 1,2);m = clz.getDeclaredMethod("say", String.class);m.invoke(o,"http://blog.csdn.net/unix21/");}
}


参考:

java中的反射,invoke方法

getMethod方法第一个参数指定一个需要调用的方法名称
第二个参数是需要调用方法的参数类型列表,是参数类型!如无参数可以指定null。
参数必须和方法中一样int和Integer,double和Double被视为不同的类型。


反射中getMethods 与 getDeclaredMethods 的区别

public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
public Method[] getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

当然也包括它所实现接口的方法。


JAVA深入研究——Method的Invoke方法【非常深入,讲了实现细节】

可以看到Method.invoke()实际上并不是自己实现的反射调用逻辑,而是委托给sun.reflect.MethodAccessor来处理。 
每个实际的Java方法只有一个对应的Method对象作为root。这个root是不会暴露给用户的,而是每次在通过反射获取Method对象时新创建Method对象把root包装起来再给用户。
在第一次调用一个实际Java方法对应得Method对象的invoke()方法之前,实现调用逻辑的MethodAccessor对象还没创建;
等第一次调用时才新创建MethodAccessor并更新给root,然后调用MethodAccessor.invoke()真正完成反射调用。

java反射机制详解 及 Method.invoke解释

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。


三.Class<?>与Class

Class<?> clz = Class.forName("org.me.javaapp.Child");Class clzz = Class.forName("org.me.javaapp.Child");Object o = clzz.newInstance();Method m = clz.getMethod("add", int.class,int.class);m.invoke(o, 1,2);m = clz.getDeclaredMethod("say", String.class);m.invoke(o,"http://blog.csdn.net/unix21/");
效果是一样的。

相关文章:

今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用

阳春三月&#xff0c;万象更新&#xff0c;2020年注定是不平凡的一年&#xff01;有激荡就会遇见变革&#xff0c;有挑战就会迎来机遇。今天总会过去&#xff0c;未来将会怎样&#xff1f;香港科大商学院内地办事处重磅推出全新升级的《袁老师访谈录》全新系列【问诊未来院长系…

Openoffice 安装与配置

1、软件下载 路径&#xff1a;http://download.openoffice.org/ 2、软件安装 [rootOpenbo linux]# tar zxvf OOo_3.2.1_Linux_x86_install-rpm-wJRE_zh-CN.tar.gz[rootOpenbo linux]# cd OOO320_m18_native_packed-1_zh-CN.9502/[rootOpenbo OOO320_m18_native_packed-1_zh-CN.…

比较分析与数组相关的sizeof和strlen

// 形如&#xff1a; int a[]{1,2,3,4,5}; char name[]"abcdef";无论是整型数组还是字符数组&#xff0c;数组名作为右值的时候都代表数组首元素的首地址。数组发生降级&#xff08;数组名退化为数组首元素的地址&#xff09;的情况&#xff1a;数组传参、数组名参与…

Python正则表达式,看这一篇就够了

作者 | 猪哥来源 | 裸睡的猪&#xff08;ID: IT--Pig&#xff09;大多数编程语言的正则表达式设计都师从Perl&#xff0c;所以语法基本相似&#xff0c;不同的是每种语言都有自己的函数去支持正则&#xff0c;今天我们就来学习 Python中关于 正则表达式的函数。re模块主要定义了…

Spring MVC 4

Spring MVC 4 项目文件结构 pom.xml依赖 <properties><endorsed.dir>${project.build.directory}/endorsed</endorsed.dir><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies> …

SQL Server 2008高可用性系列:数据库快照

SQL Server 2008高可用性系列&#xff1a;数据库快照http://database.51cto.com 2010-09-13 14:45 我爱菊花 博客园 我要评论(0)摘要&#xff1a;我们今天要讨论的话题是数据库快照。在SQL Server 2008高可用性中&#xff0c;快照是一项很重要的内容&#xff0c;可以提供至…

PostgreSQL 9.3 beta2 stream replication primary standby switchover bug?

[更新]已有patch. 请参见.PostgreSQL 9.1,9.2,9.3 clean switchover Primary and Standby Patch. http://blog.163.com/digoal126/blog/static/16387704020136197354054/打补丁前的测试 : PostgreSQL 9.3 beta2 无法完成正常的主备角色切换.Primary : psql checkpont; pg_cont…

Apache commons-io

添加引用 <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>按行写&#xff1a; public static void writeFileLineByApacheIO(String fileContent) throws…

Oracle Exadata 简介

随着企业业务的发展&#xff0c;大型数据仓库越来越多&#xff0c;其规模也在迅速扩大&#xff0c;平均每两年规模增大3倍。大型数据仓库要求以最高的磁盘读取速度扫描几十、几百或几千个磁盘&#xff0c;只有磁盘和服务器之间的管道带宽增加10倍或更多才能满足此要求&#xff…

推荐系统的价值观

作者丨gongyouliu来源丨大数据与人工智能&#xff08;ID: ai-big-data&#xff09;推荐系统作为满足人类不确定性需求的一种有效工具&#xff0c;是具有极大价值的&#xff0c;这种价值既体现在提升用户体验上&#xff0c;又体现在获取商业利润上。对绝大多数公司来说&#xff…

PostgreSQL md5 auth method introduce, with random salt protect

在上一篇BLOG中介绍了不要在pg_hba.conf中使用password认证方法, 除非你的客户端和数据库服务器之间的网络是绝对安全的.http://blog.163.com/digoal126/blog/static/1638770402013423102431541/MD5方法,认证过程 : Encrypting Passwords Across A Network The MD5 authenticat…

常用Maven收集以及Maven技巧

1.完整的Maven的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apach…

大促下的智能运维挑战:阿里如何抗住“双11猫晚”?

作者 | 阿里文娱技术专家子霖出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2019 双 11 猫晚在全球近 190 个国家和地区播出&#xff0c;海外重保是首要任务&#xff0c;如何提升海外用户观看猫晚的体验&#xff1f;本文将详解双 11 猫晚国际化的技术挑战和技术策略…

这次真的是下定决心了

这次我想是真的&#xff0c;真的。 上上周买了一本书 数据结构 c版 看到这本书的重点 线性表第三节&#xff0c;看不下去了&#xff0c;由于我模板学的不怎么样&#xff0c;数据结构c版大部分涉及了c 的模板&#xff0c;而且我觉得这本书上的代码有些漏洞。上上周买书的第三天…

子弹实例化的代码

using UnityEngine; using System.Collections;public class fire : MonoBehaviour {public float rate 0.2f;public GameObject bullet;private void Start(){OnFire();}//实例化子弹public void Fire(){GameObject.Instantiate(bullet, transform.position, Quaternion.iden…

Shiro源码学习之一

一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.2.4</version></dependency><dependency> <groupId>org.slf4j</groupId> …

传百度要与阿里、腾讯争夺在线办公市场?“百度Hi”开放520人同时在线音视频会议

在线办公市场持续火热。4月20日&#xff0c;百度旗下在线办公平台“百度Hi”再升级&#xff0c;正式发布业内大规模的520人音视频会议&#xff0c;并支持多入口快速入会&#xff0c;加码在线办公。另有消息称&#xff0c;4月底&#xff0c;百度在线办公平台将发布重磅升级&…

SQL 2008 安装资料及下载地址

SQL Server 2008 序列号&#xff1a; Developer: PTTFM-X467G-P7RH2-3Q6CG-4DMYB Enterprise: JD8Y6-HQG69-P9H84-XDTPG-34MBB 服务器设置SQL Server 代理 NT AUTHORITY\SYSTEMSQL Server Database Engine NT AUTHORITY\NETWORK SERVICE SQL Server Browser 默认 SQL Ser…

Objective-C非正式协议与正式协议

为什么80%的码农都做不了架构师&#xff1f;>>> 类别与类扩展的区别&#xff1a; ①类别中只能增加方法&#xff1b; ②是的&#xff0c;你没看错&#xff0c;类扩展不仅可以增加方法&#xff0c;还可以增加实例变量&#xff08;或者合成属性&#xff09;&#xff…

Shiro源码学习之二

接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws AuthenticationException {clearRunAsIdentitiesInternal();Subject subject securityManager.login(this, token);PrincipalCollection principals;String hos…

Widgets 整理

1.滑动条 http://www.newnaw.com/pub/sl/031.html <--!grid中的内容--> <Grid x:Name"slidergrid" HorizontalAlignment"Left" VerticalAlignment"Center" Background"Azure" Margin"20"> <StackPane…

黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下!

作者 | IrrfanAk译者 | 天道酬勤、Carol 责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;机器学习以分析大型数据集和模式识别的能力而闻名。它基本上属于人工智能的一个子集。而机器学习使用的算法&#xff0c;是利用了先前的数据集和统计分析来做出假设…

ServletResponse-中文名的下载

2019独角兽企业重金招聘Python工程师标准>>> package com.httpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.se…

Linux环境编译安装OpenJDK

Centos6.5 AMD64位机器 Java的源码是C,C和Java实现的&#xff0c;所以还需要有一个安装好的java建议选OracleJDK参考文末 安装OracleJDK Linux环境安装卸载JDK以及安装Tomcat和发布Java的web程序 安装依赖 | Install dependence # yum -y install gcc gcc-c alsa-lib alsa-…

最快69秒逆向DRAM地址映射,百度设计的这款逆向工具如何做到快速可靠?

来源 | 百度安全实验室出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;近日&#xff0c;国际顶级设计自动化大会DAC大会公布DAC 2020会议议程和论文名单&#xff0c;由百度安全发表的《DRAMDig: AKnowledge-assisted Tool to Uncover DRAM Address M…

国外厂商在行业客户上输单的原因

这两天听一个朋友聊天发泄&#xff0c;他在一家总代J公司工作&#xff0c;代理业内排行第一的国外厂商C公司的产品&#xff0c;他负责D行业在南方某几个省的销售业务&#xff0c;工作中需要与C公司的销售紧密配合。经过接近一年的工作&#xff0c;他拿到一些项目&#xff0c;但…

[android] 从gallery获取图片

效果就是点击按钮&#xff0c;打开系统图库应用&#xff0c;可以选择一张里面的图片展示出来 设置隐式意图 获取Intent对象&#xff0c;通过new出来 调用Intent对象的setAction()方法&#xff0c;设置动作&#xff0c;参数&#xff1a;Intent.ACTION_PICK 调用Intent对象的setT…

调试JDK源码-HashSet实现原理

调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因 代码 Set<String> snew HashSet<String>();s.add("http://blog.csdn.ne…

Python 炫技操作:海象运算符的三种用法

作者 | 明哥来源 | Python编程时光&#xff08;ID:Cool-Python&#xff09;Python 版本发展非常快&#xff0c;如今最新的版本已经是 Pyhton 3.9&#xff0c;即便如此&#xff0c;有很多人甚至还停留在 3.6 或者 3.7&#xff0c;连 3.8 还没用上。很多 Python 3.8 的特性还没来…

2010.10.30 OA 项目组一周工作报告

本周基本上实现了上周的目标&#xff0c;但和计划相比有落后。 进度&#xff1a;55 本周提交了3.0任务评估的第一个版本&#xff0c;一共为1003小时&#xff0c;客户收到该评估后&#xff0c;对3.0任务进行了调整&#xff0c;将部分任务移到2011.2版本中&#xff0c;同时添加了…