设为首页 加入收藏

TOP

Java反射机制详解 及 Method.invoke解释(一)
2015-02-25 16:14:50 来源: 作者: 【 】 浏览:87
Tags:Java 反射 机制 详解 Method.invoke 解释

Java反射机制


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


1. 得到某个对象的属性


1.public Object getProperty(Object owner, String fieldName) throws Exception {?
2.? ? Class ownerClass = owner.getClass();?
3.?
4.? ? Field field = ownerClass.getField(fieldName);?
5.?
6.? ? Object property = field.get(owner);?
7.?
8.? ? return property;?
9.}?


?
Class ownerClass = owner.getClass():得到该对象的Class。


Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。


Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。


2. 得到某个类的静态属性


1.public Object getStaticProperty(String className, String fieldName)?
2.? ? ? ? ? ? throws Exception {?
3.? ? Class ownerClass = Class.forName(className);?
4.?
5.? ? Field field = ownerClass.getField(fieldName);?
6.?
7.? ? Object property = field.get(ownerClass);?
8.?
9.? ? return property;?
10.}?


?


Class ownerClass = Class.forName(className) :首先得到这个类的Class。


Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。


Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。


3. 执行某对象的方法


1.public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {?
2.?
3.? ? Class ownerClass = owner.getClass();?
4.?
5.? ? Class[] argsClass = new Class[args.length];?
6.?
7.? ? for (int i = 0, j = args.length; i < j; i++) {?
8.? ? ? ? argsClass[i] = args[i].getClass();?
9.? ? }?
10.?
11.? ? ? Method method = ownerClass.getMethod(methodName,argsClass);?
12.?
13.? ? return method.invoke(owner, args);?
14.}?


?
Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。


5~9行:配置参数的Class数组,作为寻找Method的条件。


Method method = ownerClass.getMethod(methodName, argsClass):通过methodName和参数的argsClass(方法中的参数类型集合)数组得到要执行的Method。


method.invoke(owner, args):执行该Method.invoke方法的参数是执行这个方法的对象owner,和参数数组args,可以这么理解:owner对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值。


4. 执行某个类的静态方法


1.public Object invokeStaticMethod(String className, String methodName,?
2.? ? ? ? ? ? Object[] args) throws Exception {?
3.? ? Class ownerClass = Class.forName(className);?
4.?
5.? ? Class[] argsClass = new Class[args.length];?
6.?
7.? ? for (int i = 0, j = args.length; i < j; i++) {?
8.? ? ? ? argsClass[i] = args[i].getClass();?
9.? ? }?
10.?
11.? ? Method method = ownerClass.getMethod(methodName,argsClass);?
12.?
13.? ? return method.invoke(null, args);?
14. }?


基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。


5. 新建实例


1.public Object newInstance(String className, Object[] args) throws Exception {?
2.? ? Class newoneClass = Class.forName(className);?
3.?
4.? ? Class[] argsClass = new Class[args.length];?
5.?
6.? ? for (int i = 0, j = args.length; i < j; i++) {?
7.? ? ? ? argsClass[i] = args[i].getClass();?
8.? ? }?
9.?
10.? ? Constructor cons = newoneClass.getConstructor(argsClass);?
11.?
12.? ? return cons.newInstance(args);?
13.?
14.}?
?
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。


Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。


第5~第9行:得到参数的Class数组。


Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。


cons.newInstance(args):新建实例。


6. 判断是否为某个类的实例


1.public boolean isInstance(Object obj, Class cls) {?
2.? ? return cls.isInstance(obj);?
3.}?


?
7. 得到数组中的某个元素


1.public Object getByArray(Object array, int inde

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java工厂模式(Factory模式) 下一篇Java 代理使用及代理原理

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: