标签:
java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
动态的获取类中的信息,就是java反射
java反射的作用示意图(可以对已经定义的代码利用配置文件进行扩展,不用修改源代码,源文件提供了接口,开发者可以编写实现接口的类,类中存在处理请求和应答方式,再进行配置,即可达到原程序的扩展,)
package reflect.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import useclass.Person; public class reflectDemo { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException { getFieldDemo();//获取字段 creatNewClass();//根据class文件创建对象 creatNewClass_2();//有有参数的构造方法实例化 } public static void getFieldDemo() throws ClassNotFoundException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InstantiationException { Class cla=Class.forName("useclass.Person"); Field f=null;//cla.getField("age"); f=cla.getDeclaredField("name"); //对私有字段的访问取消权限检查,暴力访问 f.setAccessible(true); Object obj=cla.newInstance(); f.set(obj,"小强");//把名字设置为小强 Object o=f.get(obj); System.out.println(o); } public static void creatNewClass_2() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { /* * 当获取指定名称对应类中的所体现的对象时, * 而该对象初始化不使用空参数构造,应该先获取到该构造函数 * 通过字节码文件对象即可完成 * 方法是:getConstructor(paramterTypes); */ String name="useclass.Person"; Class cla=Class.forName(name);//得到class文件 Constructor con=cla.getConstructor(String.class,int.class);//得到指定参数构造函数 Object obj=con.newInstance("小强",32);//用指定参数构造函数实例化 System.out.println(cla.getFields()); } public static void creatNewClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException{ //早期:new的时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存, //并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象 useclass.Person p=new useclass.Person(); //现在: String name="useclass.Person"; //找寻该名称类文件,并加载进内存,,并产生Class对象 Class cla=Class.forName(name); //产生该类的对象 Object obj=cla.newInstance();//获取带参数的构造函数,并实例化 } }
标签:
原文地址:http://www.cnblogs.com/lzzhuany/p/4519043.html