`
Jameslyy
  • 浏览: 386375 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java reflection

阅读更多

Java Reflection(反射)是一种在运行期间查看Java对象内部情况的技术,包括Java对象的变量、支持的方法、实现的接口、扩展的类——基本上在编译时你能想知道的关于对象的任何东西。

Reflection API位于java.lang.reflect包中。

载入指定的类,Class c = Class.forName(String className); 例,Class c = Class.forName("java.lang.String");

访问类的内部成员和其他相关信息:

  • getMethods():返回一组表示类或接口的所有公共方法的方法对象数组。
  • getConstructors():返回一组表示类的所有公共构造器的构造器对象数组。
  • getFields():返回一组表示类或接口所有公共字段的字段对象数组。
  • getClasses():返回一组表示所有属于类或接口的公共类和接口(例如,内部类)的类对象数组。
  • getSuperclass():返回表示类或接口的超类的类对象(接口返回为空值)。
  • getInterfaces():返回一组表示类或接口执行的所有接口的类对象数组。

更精确的一些方法:

  • getMethod("methodName", Class...):返回表示接受类参数指定参数的类或接口中名为“methodName”的公共方法的方法对象。
  • getConstructor(Class...):返回表示接受类参数指定参数的类公共构造器的构造器对象。
  • getField("fieldName"):返回表示类或接口中名为“fieldname”的公共字段的字段对象。

 动态调用类内部的方法:

  • Field.get(Object):返回一个包含输入get()对象实例的字段值对象。(如果字段对象表示静态字段,那么对象参数便被忽略,也可能为空。)
  • Method.invoke(Object, Object...):返回一个包含为输入invoke()的第一个对象参数实例调用方法的结果的对象。其余对象参数被传递给输入方法。(如果方法对象表示一个静态方法,那么第一个对象参数便被忽略,也可能为空。)
  • Constructor.newInstance(Object...):返回调用构造器的新对象实例。对象参数输入构造器。(注意类的无参数构造器也可以通过newInstance()被调用。)

调用内部方法:

java 代码
  1. // method
  2. public int add(int a, int b) {
  3.     return a + b;
  4. }
  5. // sample
  6. Class cls = Class.forName("method2");   
  7. Class partypes[] = new Class[2];   
  8. partypes[0] = Integer.TYPE;   
  9. partypes[1] = Integer.TYPE;   
  10. Method meth = cls.getMethod("add", partypes);   
  11. method2 methobj = new method2();   
  12. Object arglist[] = new Object[2];   
  13. arglist[0] = new Integer(37);   
  14. arglist[1] = new Integer(47);   
  15. Object retobj= meth.invoke(methobj, arglist);   
  16.   

初始化对象:

java 代码
  1. // constructor   
  2. public constructor2 ( ) {   
  3.   
  4. }   
  5.   
  6. public constructor2 (int a, int b) {   
  7.      System.out.println("a = " + a + " b = " + b);   
  8. }   
  9.   
  10. // sample   
  11. Class cls = Class.forName("constructor2");   
  12. Class partypes[] = new Class[2];   
  13. partypes[0] = Integer.TYPE;   
  14. partypes[1] = Integer.TYPE;   
  15. Constructor ct = cls.getConstructor(partypes);   
  16. Object arglist[] = new Object[2];   
  17. arglist[0] = new Integer(37);   
  18. arglist[1] = new Integer(47);   
  19. Object retobj = ct.newInstance(arglist);   
  20.   

改变字段(域)的值:

java 代码
  1. Class cls = Class.forName("field2");   
  2. Field fld = cls.getField("d");   
  3. field2 f2obj = new field2();   
  4. System.out.println("d = " + f2obj.d);   
  5. fld.setDouble(f2obj, 12.34);   
  6.   

使用数组:

java 代码
  1. Class cls = Class.forName("java.lang.String");   
  2. Object arr = Array.newInstance(cls, 10);   
  3. Array.set(arr, 5"this is a test");   
  4. String s = (String)Array.get(arr, 5);   
  5. System.out.println(s);   
  6.   

 

参考:

Sun java reflection tutorial  http://java.sun.com/docs/books/tutorial/reflect/index.html

Java Reflection-JAVA反射 http://www.mikecat.net/blogview.asp?logID=1421  

使用 Java Reflection  http://www.apusic.com/article/article5.htm  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics