候捷谈Java反射机制
“Class” object的取得途径
Java允许我们从多种管道为一个class生成对应的Class object。图2是一份整理。
|
Class object 诞生管道
|
示例
|
|
运用getClass()
注:每个class 都有此函数
|
String str = "abc";
Class c1 = str.getClass();
|
|
运用
Class.getSuperclass()2
|
Button b = new Button();
Class c1 = b.getClass();
Class c2 = c1.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;
|
图2:Java 允许多种管道生成Class object。
Java classes 组成分析
首先容我以图3的java.util.LinkedList为例,将Java class的定义大卸八块,每一块分别对应图4所示的Reflection API。图5则是“获得class各区块信息”的程序示例及执行结果,它们都取自本文示例程序的对应片段。
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;
}
图3:将一个Java class 大卸八块,每块相应于一个或一组Reflection APIs(图4)。
Java classes 各成份所对应的Reflection APIs
图3的各个Java class成份,分别对应于图4的Reflection API,其中出现的Package、Method、Constructor、Field等等classes,都定义于java.lang.reflect。
|
Java class 内部模块(参见图3)
|
Java class 内部模块说明
|
相应之Reflection API,多半为Class methods。
|
返回值类型(return type)
|
|
(1) package
|
class隶属哪个package
|
getPackage()
|
Package
|
|
(2) import
|
class导入哪些classes
|
无直接对应之API。
解决办法见图5-2。
|
|
|
(3) modifier
|
class(或methods, fields)的属性
|
int getModifiers()
Modifier.toString(int)
Modifier.isInterface(int)
|
int
String
bool
|
|
(4) class name or interface name
|
class/interface
|
名称getName()
|
String
|
|
(5) type parameters
|
参数化类型的名称
|
getTypeParameters()
|
TypeVariable <Class>[]
|
|
(6) base class
|
base class(只可能一个)
|
getSuperClass()
|
Class
|
|
(7) implemented interfaces
|
实现有哪些interfaces
|
getInterfaces()
|
Class[]
|
|
(8) inner classes
|
内部classes
|
getDeclaredClasses()
|
Class[]
|
|
(8') outer class
|
如果我们观察的class 本身是inner classes,那么相对它就会有个outer class。
|
getDeclaringClass()
|
Class
|
|
(9) constructors
|
构造函数getDeclaredConstructors()
|
不论 public 或private 或其它access level,皆可获得。另有功能近似之取得函数。
|
Constructor[]
|
|
(10) methods
|
操作函数getDeclaredMethods()
|
不论 public 或private 或其它access level,皆可获得。另有功能近似之取得函数。
|
Method[]
|
|
(11) fields
|
字段(成员变量)
|
getDeclaredFields()不论 public 或private 或其它access level,皆可获得。另有功能近似之取得函数。
|
Field[]
|
图4:Java class大卸八块后(如图3),每一块所对应的Reflection API。本表并非
Reflection APIs 的全部。
0
相关文章