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]