geminiyellow 发表于 2013-2-5 02:13:36

JAVA反射摘抄

  摘抄自《候捷谈Java反射机制》
     Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
  “Class”class<span style="font-size: x-small;"><span style="">   Java有个Object class,是所有Java classes的继承根源,其内声明了数个应该在所有Java class中被改写的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class object。
  针对任何您想探勘的class,唯有先为它产生一个Class object。
  “Class” object的取得途径<span style="font-size: x-small;"><span style=""><span style="">   Java允许我们从多种管道为一个class生成对应的Class object。
<span style="font-size: x-small;"><span style="font-size: x-small;"><span style="">Class object 诞生管道 
 示例getClass() 注:每个class 都有此函数String str = "abc"; Class cStr = str.getClass();Class.getSuperclass()Button btn = new Button(); Class cBtn = btn.getClass();Class cBtnSpr = cBtn.getSuperclass();static method Class.forName()Class c1 = Class.forName ("java.lang.String");
Class c2 = Class.forName ("java.awt.Button");
Class c3 = Class.forName ("java.util.LinkedList$Entry");
Class c4 = Class.forName ("I");
Class c5 = Class.forName ("[I");
.class 语法Class c1 = String.class;
Class c2 = java.awt.Button.class;
Class c3 = Main.InnerClass.class;
Class c4 = int.class;
Class c5 = int[].class;
primitive wrapper classes的TYPE语法Class c1 = Boolean.TYPE;
Class c2 = Byte.TYPE;
Class c3 = Character.TYPE;
Class c4 = Short.TYPE;
Class c5 = Integer.TYPE;
Class c6 = Long.TYPE;
Class c7 = Float.TYPE;
Class c8 = Double.TYPE;
Class c9 = Void.TYPE;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
 
 
 
 
 
 
 
   
 
<span />








以java.util.LinkedList为例

package java.util;                      //(1)import java.lang.*;                     //(2)public class LinkedList<E>            //(3)(4)(5)  extends AbstractSequentialList<E>       //(6)  implements List<E>, Queue<E>,  Cloneable, java.io.Serializable         //(7)  {    private static class Entry<E> { … }//(8)    public LinkedList() { … }         //(9)    public LinkedList(Collection<? extends E> c) { … }    public E getFirst() { … }         //(10)    public E getLast() { … }    private transient Entry<E> header = …;//(11)    private transient int size = 0;  }  Java classes 各成份所对应的Reflection APIs  以上Java class成份,分别对应于下图的Reflection API,其中出现的Package、Method、Constructor、Field等等classes,都定义于java.lang.reflect。  Java class 内部模块内部模块说明相应之Reflection API返回值类型(1) package类所在的包getPackage()Package(2) import类导入的另外的类无直接对应API (3) modifier类(或方法,变量)的属性int getModifiers()
Modifier.toString(int)
Modifier.isInterface(int)
int
String
bool
(4) 类名或接口名
类或接口名称getName()String(5) 参数类型
参数化类型的名称getTypeParameters()TypeVariable
<Class>[]
(6) 超类
超类(只有一个)getSuperClass()Class (7)实现接口实现哪些接口getInterfaces()Class[](8)内部类内部类getDeclaredClasses()Class[](8')外部类如果观察类本身是内部类,
相对应就有一个外部类
getDeclaringClass()Class(9)构造函数构造函数不论 public 或private
或其它access level,皆可获得。
另有功能近似之取得函数。Constructor[] (10)方法操作函数不论 public 或private
或其它access level,皆可获得。
另有功能近似之取得函数。Method[] (11)变量字段,成员变量getDeclaredFields()
不论 public 或private
或其它access level,皆可获得。
另有功能近似之取得函数。Field[]  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<span style="">
Class c = null;c = Class.forName(args);Package p;p = c.getPackage();if (p != null){  System.out.println("package "+p.getName()+";");}执行结果(例):package java.util;    int mod = c.getModifiers();  System.out.print(Modifier.toString(mod)); // 整个modifier    if (Modifier.isInterface(mod)) {      System.out.print(" "); // 关键词 "interface" 已含于modifier    } else {      System.out.print(" class "); // 关键词 "class"    }  System.out.println(c.getName()); // class 名称执行结果(例):public class java.util.LinkedList  TypeVariable<Class>[] tv;tv = c.getTypeParameters(); for (int i = 0; i < tv.length; i++) {  String x = tv.getName(); // 例如 E,K,V...  if (i == 0) { // 第一个    System.out.print("<" + x);  } else {  // 非第一个    System.out.print("," + x);  }  if (i == tv.length - 1) // 最后一个    System.out.println(">");  }执行结果(例):<E> Class supClass;supClass = c.getSuperclass();if (supClass != null) {// 如果有super class  System.out.print("extends" + supClass.getName());}执行结果(例):extends java.util.AbstractSequentialList  Class cc[];// 找出所有被实现的interfacescc = c.getInterfaces();if (cc.length != 0) {  System.out.println("implements "); // 关键词  for (Class cite : cc) {// JDK1.5 循环写法    System.out.print(cite.getName() + ", ");  }}  Class cc[];cc = c.getDeclaredClasses(); // 找出inner classesClass ctmp;for (Class cite : cc) {  System.out.println(cite.getName());}ctmp = c.getDeclaringClass(); // 找出outer classesif (ctmp != null) {  System.out.println(ctmp.getName());}  Constructor cn[];cn = c.getDeclaredConstructors();for (int i = 0; i < cn.length; i++) {  int md = cn.getModifiers();  System.out.print(" " + Modifier.toString(md) + " "  + cn.getName());  Class cx[] = cn.getParameterTypes();  System.out.print("(");  for (int j = 0; j < cx.length; j++) {    System.out.print(cx.getName());    if (j < (cx.length - 1)) {      System.out.print(", ");    }  }  System.out.println(")");}执行结果(例):public java.util.LinkedList(java.util.Collection)public java.util.LinkedList()  Method mm[];mm = c.getDeclaredMethods();for (int i = 0; i < mm.length; i++) {  int md = mm.getModifiers();  System.out.print(" " + Modifier.toString(md) + " "  + mm.getReturnType().getName() + " " + mm.getName());  Class cx[] = mm.getParameterTypes();  System.out.print("(");  for (int j = 0; j < cx.length; j++) {    System.out.print(cx.getName());    if (j < (cx.length - 1)) {System.out.print(", ");    }  }  System.out.println(")");}  Field ff[];ff = c.getDeclaredFields();for (int i = 0; i < ff.length; i++) {  int md = ff.getModifiers();  System.out.println(" " + Modifier.toString(md) + " "  + ff.getType().getName() + " " + ff.getName() + ";");}  
 
Reflection 的另三个动态性质:
(1) 运行时生成instances,
(2) 执行期唤起methods,
(3) 运行时改动fields
 
不带参数的类:
Class c = Class.forName("DynTest");Object obj = null;obj = c.newInstance(); //不带自变量System.out.println(obj); 
带参数的类:
Class c = Class.forName("DynTest");Class[] pTypes = new Class[] { double.class, int.class };Constructor ctor = c.getConstructor(pTypes);//指定parameter list,便可获得特定之ctorObject obj = null;Object[] arg = new Object[] {3.14159, 125}; //自变量obj = ctor.newInstance(arg);System.out.println(obj); 
 
动态唤起method:
Class c = Class.forName("DynTest");Class ptypes[] = new Class;ptypes = Class.forName("java.lang.String");ptypes = Class.forName("java.util.Hashtable");Method m = c.getMethod("func", ptypes);DynTest obj = new DynTest();Object as[] = new Object;as = new String("Hello,world");as = null;Object r = m.invoke(obj, as); 
运行时变更Fields内容:
Class c = Class.forName("DynTest");DynTest obj = new DynTest();Field f = c.getField("str");System.out.println("d= " + (String) f.get(obj));f.set(obj, "Hello");System.out.println("d= " + obj.str); 
页: [1]
查看完整版本: JAVA反射摘抄