标签:
首先说到反射,大家肯定不会陌生,如果不知道反射,相信那些市面上常用的主流框架就不会出现了。废话不说,上主题!
Java反射机制
运行时
判断任意一个对象所属的类
构造任意一个类的对象
判断任意一个类所具有的成员变量和方法
调用一个对象的方法
注意点:运行时,而不是编译时
首先概念性的东西,小编就不细说了,想了解的直接问度娘吧,直接上干货吧。
通过反射来进行方法调用的具体步骤:
1.首先要获取Class对象(手段比较多,例如通过forname手段和InvokeTester.class手段)
2.如果想调用方法获取Method对象(),如果想操作字段就要获取Field[]对象
上面这两点一会儿下面的代码中都会体现的,大家不要着急。
小编这里想说两点,关于调用类的构造方法的实现,当然构造方法分成带参数和不带参数的,先来一段不带参数
Class c = Test.class; c.newInstance();另一种写法:
Constructor con = c.getConstructor(new Class[]{}); con.newInstance(new Object[]{});
带参数的构造方法调用
Class c = Test.class; Constructor con = c.getConstructor(new Class[]{double.class,int.class}); con.newInstance(new Object[]{1.2,3})//类型一致
再次声明。反射是各大框架的基础,通过反射我们可以获取类,类的方法,类的变量等等,这样才会有了现在的Struts,spring等等。
最后来看一段代码:
package cn.tgb.reflection; public class PrivateTest { private String name = "hello"; public String getName(){ return this.name; } }
问:如果将变量name的值,换成world呢?当然,通过反射的方式了,来看下一段代码吧。
package cn.tgb.reflection; import java.lang.reflect.Field; public class ReflectionTest { public static void main(String[] args) throws Exception { PrivateTest pt = new PrivateTest(); Class<?> clazz = PrivateTest.class; Field field = clazz.getDeclaredField("name"); field.setAccessible(true);//压制java的访问控制检查。 field.set(pt, "world"); System.out.println(field.get(pt)); } }大家可以运行一下上面的代码,看看输出的结构是否是world。最后通过反射,获取类中的字段名,然后通过set的方式就可以修改字段的名啦。
标签:
原文地址:http://blog.csdn.net/u010158267/article/details/51347042