读书人

反照基本概念

发布时间: 2012-09-02 21:00:34 作者: rapoo

反射基本概念

在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属性。?

Java代码
  1. import?java.lang.reflect.Field;??
  2. import?java.lang.reflect.Method;??
  3. ??
  4. ??
  5. ??
  6. class?User{??
  7. ??????
  8. ?????private?String?userName="";??
  9. ???????
  10. ????????public?String?getUserName()?{??
  11. ????????return?userName;??
  12. ????}??
  13. ????????public?int?add(int?a,?int?b)?{??
  14. ????????????return?a?+?b;??
  15. ????????}??
  16. ????????private?int?minus(int?a,int?b)??
  17. ????????{??
  18. ????????????return?a-b;??
  19. ????????}??
  20. ??
  21. }??
  22. public?class?ReflectTest?{??
  23. ?????
  24. ????/**?
  25. ?????*?@param?args?
  26. ?????*/??
  27. ????public?static?void?main(String[]?args)?throws?Exception?{??
  28. ??????????
  29. ????????Class<?>?classType=Class.forName("User");//得到class对象??
  30. ????????Method[]?meth=classType.getDeclaredMethods();//得到该class所有声明method??
  31. ????????for?(Method?method?:?meth)?{??
  32. ????????????System.out.println("method:"+method);??
  33. ????????}??
  34. ????????Field?[]?fiel=classType.getDeclaredFields();//得到该class所有声明field??
  35. ????????for?(Field?field?:?fiel)?{??
  36. ????????????System.out.println("fiueld:"+field);??
  37. ????????}??
  38. ????????User?user=(User)classType.newInstance();//通过class获得User对象??
  39. ????????Method?method=classType.getMethod("add",new?Class<?>[]{int.class,int.class});//获取add方法,考虑到方法重载,还要加上参数条件才能唯一限定一个方法??
  40. ????????int?result=(Integer)method.invoke(user,?new?Object[]{3,9});//通过invoke调用方法??
  41. ????????System.out.println("addresult:"+result);??
  42. ????????/**?
  43. ?????????*?通过反射来访问方法的私有方法?
  44. ?????????*/??
  45. ????????Method?methodminus=classType.getDeclaredMethod("minus",new?Class<?>[]{int.class,int.class});//通过getDeclaredMethod取得私有的方法??
  46. ????????methodminus.setAccessible(true);//将可访问性设置为true??
  47. ????????int?resultminus=(Integer)methodminus.invoke(user,?new?Object[]{3,9});//通过invoke调用方法??
  48. ????????System.out.println("resultminus:"+resultminus);??
  49. ????????/**?
  50. ?????????*?通过反射来访问方法的私有属性?
  51. ?????????*/??
  52. ????????Field?field=classType.getDeclaredField("userName");??
  53. ????????field.setAccessible(true);//将可访问性设置为true??
  54. ????????field.set(user,?"bingyingao");//给私有属性userName赋值??
  55. ????????System.out.println(user.getUserName());??
  56. ????}??
  57. ??
  58. } ?

读书人网 >编程

热点推荐