反射基本概念
在java运行时环境中,对于任意一个类,能够动态的获取类的信息,动态调用类的方法。?
在运行期间:判断,构造,调用任意一个类的成员变量和方法。而在编译期间:我们是用new 创建java的对象。?
通过reflection机制,我们可以在运行时取得任何一个已知名称的class的内部信息,包括其修饰符,以及superclass,interfaces,也包括fields和methods的所有信息。?
在jdk中主要由以下类来实现java反射机制:?
-class类,?
-Field类,?
-Mehtod类,?
-Array类。?
------------------?
动态语言定义:程序运行时,允许改变程序结构或者变量类型,这种语言称为动态语言。从这个观点看,perl,python,ruby,javasacript是动态语言,c++,java,c#不是动态语言。但是java却有一个非常突出的动态相关机制,Reflection。?
----------------------?
1.要想使用反射,首先需要获得待处理类或对象的class对象?
2.获取class的三种方法。?
1)通过Class.forName("");?
2)通过类.class,eg:string.class;?
3)通过对象的 obj.getClass();?
3.若想通过类的不带参数的构造方法生成对象,有两种方式:?
a)先获得class对象,然后通过class对象的newInstance()方法直接生成即可?
b)先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class;?
Constructor cons=classType.getConstructor(new Class[]{});?
Object obj=new cons.newInstance(new Object[]{});?
4.?
若想通过类的带参数的构造方法生成对象,只有一个方法:?
先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class;?
Constructor cons=classType.getConstructor(new Class[String.class,int.class]{});?
Object obj=new cons.newInstance(new Object[]{"abing",5});?
5.通过反射可以调用一个对象的private方法,或者修改一对象的private属性。?
- import?java.lang.reflect.Field;??
- import?java.lang.reflect.Method;??
- ??
- ??
- ??
- class?User{??
- ??????
- ?????private?String?userName="";??
- ???????
- ????????public?String?getUserName()?{??
- ????????return?userName;??
- ????}??
- ????????public?int?add(int?a,?int?b)?{??
- ????????????return?a?+?b;??
- ????????}??
- ????????private?int?minus(int?a,int?b)??
- ????????{??
- ????????????return?a-b;??
- ????????}??
- ??
- }??
- public?class?ReflectTest?{??
- ?????
- ????/**?
- ?????*?@param?args?
- ?????*/??
- ????public?static?void?main(String[]?args)?throws?Exception?{??
- ??????????
- ????????Class<?>?classType=Class.forName("User");//得到class对象??
- ????????Method[]?meth=classType.getDeclaredMethods();//得到该class所有声明method??
- ????????for?(Method?method?:?meth)?{??
- ????????????System.out.println("method:"+method);??
- ????????}??
- ????????Field?[]?fiel=classType.getDeclaredFields();//得到该class所有声明field??
- ????????for?(Field?field?:?fiel)?{??
- ????????????System.out.println("fiueld:"+field);??
- ????????}??
- ????????User?user=(User)classType.newInstance();//通过class获得User对象??
- ????????Method?method=classType.getMethod("add",new?Class<?>[]{int.class,int.class});//获取add方法,考虑到方法重载,还要加上参数条件才能唯一限定一个方法??
- ????????int?result=(Integer)method.invoke(user,?new?Object[]{3,9});//通过invoke调用方法??
- ????????System.out.println("addresult:"+result);??
- ????????/**?
- ?????????*?通过反射来访问方法的私有方法?
- ?????????*/??
- ????????Method?methodminus=classType.getDeclaredMethod("minus",new?Class<?>[]{int.class,int.class});//通过getDeclaredMethod取得私有的方法??
- ????????methodminus.setAccessible(true);//将可访问性设置为true??
- ????????int?resultminus=(Integer)methodminus.invoke(user,?new?Object[]{3,9});//通过invoke调用方法??
- ????????System.out.println("resultminus:"+resultminus);??
- ????????/**?
- ?????????*?通过反射来访问方法的私有属性?
- ?????????*/??
- ????????Field?field=classType.getDeclaredField("userName");??
- ????????field.setAccessible(true);//将可访问性设置为true??
- ????????field.set(user,?"bingyingao");//给私有属性userName赋值??
- ????????System.out.println(user.getUserName());??
- ????}??
- ??
- } ?