Classes
通過反射機制我們可以在運行時探尋類的內部結構,並擷取以下資訊
- Class Name
- Class Modifiers (public, protected, synchronized等)
- Package Info
- Super Class
- Implemented Interfaces
- Constructors
- Methods
- Fields
- Annotations
The Class Object
所有的Java類型(包括int等基本類型)以及數組(arrays)都有相關聯的ClassObject。
The Class name
如果在編譯時間知道該類的名字,就可以如下擷取該類的Class執行個體:
import java.lang.reflect.Method;public class HelloJava { public static void main(String[] args) { Class myClass = HelloJava.class; }}
如果在運行時知道該類的名字(字串類型),則可以如下擷取該類的Class執行個體:
package tao.xiao.action;import java.lang.reflect.Method;public class HelloJava { public static void main(String[] args) throws ClassNotFoundException { Class myClass = Class.forName("tao.xiao.action.HelloJava"); System.out.println(myClass.getName()); // tao.xiao.action.HelloJava System.out.println(myClass.getSimpleName());// HelloJava }}
注意,這裡的類名必須是全限定名(含有包名)。如果運行時在classpath中找不到該類,則會拋出ClassNofFoundException。
Modifiers
package tao.xiao.action;import java.lang.reflect.Modifier;public class HelloJava {public static void main(String[] args) throws ClassNotFoundException {Class myClass = Class.forName("tao.xiao.action.HelloJava");int modifiers = myClass.getModifiers();System.out.println(Modifier.isPublic(modifiers));// trueSystem.out.println(Modifier.isPrivate(modifiers));// falseSystem.out.println(Modifier.isSynchronized(modifiers));// falseSystem.out.println(Modifier.isStatic(modifiers));// false}}
Package Info
package tao.xiao.action;public class HelloJava {public static void main(String[] args) throws ClassNotFoundException {Class myClass = Class.forName("tao.xiao.action.HelloJava");Package pack = myClass.getPackage();System.out.println(pack);}}
Superclass
package tao.xiao.action;public class HelloJava {public static void main(String[] args) throws ClassNotFoundException {Class classB= Class.forName("tao.xiao.action.B"); // 這裡B extends AClass classA = classB.getSuperclass();System.out.println(classA.getName()); // 輸出是 tao.xiao.action.A}}
Implemented Interfaces
package tao.xiao.action;public class HelloJava {public static void main(String[] args) throws ClassNotFoundException {Class classB = Class.forName("tao.xiao.action.B");Class[] interfaces = classB.getInterfaces(); // 一個類可以實現多個介面,因此這裡返回的是Class[]類型for (Class I : interfaces)System.out.println(I.getName());}}
這裡,有兩個介面IT1和IT2,類A和類B的聲明為
class A implements IT1 ... class B extends A implements IT2 ...
getInterface方法只能返回該類直接實現的介面,因此這裡的輸出為 tao.xiao.action.IT2
Constructors, Methods, Fields and Annotations
package tao.xiao.action;import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class HelloJava {public int a;private double b;protected long c;public HelloJava() {}public HelloJava(String s) {}public void f1() {}public String f2(float f) { return "xxx"; }@Overridepublic String toString() { return "xxx"; }public static void main(String[] args) throws ClassNotFoundException {Class myClass = Class.forName("tao.xiao.action.HelloJava");Constructor[] constructors = myClass.getConstructors();for (Constructor c : constructors)System.out.println("Constructor ==> " + c);Method[] methods = myClass.getMethods();for (Method m : methods)System.out.println("Method ==> " + m);Field[] fields = myClass.getFields(); // 只會返回public成員for (Field f : fields)System.out.println("Field ==> " + f);Annotation[] annotations = myClass.getAnnotations(); // 不會返回@Override註解for (Annotation an : annotations)System.out.println("Annotation ==> " + an);}}
輸出為:
Constructor ==> public tao.xiao.action.HelloJava()Constructor ==> public tao.xiao.action.HelloJava(java.lang.String)Method ==> public void tao.xiao.action.HelloJava.f1()Method ==> public java.lang.String tao.xiao.action.HelloJava.f2(float)Method ==> public static void tao.xiao.action.HelloJava.main(java.lang.String[]) throws java.lang.ClassNotFoundExceptionMethod ==> public java.lang.String tao.xiao.action.HelloJava.toString()Method ==> public final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionMethod ==> public final void java.lang.Object.wait() throws java.lang.InterruptedExceptionMethod ==> public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionMethod ==> public boolean java.lang.Object.equals(java.lang.Object)Method ==> public native int java.lang.Object.hashCode()Method ==> public final native java.lang.Class java.lang.Object.getClass()Method ==> public final native void java.lang.Object.notify()Method ==> public final native void java.lang.Object.notifyAll()Field ==> public int tao.xiao.action.HelloJava.a
下一章:非深入探尋Java反射機制(Constructors)