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)); // true
System.out.println(Modifier.isPrivate(modifiers)); // false
System.out.println(Modifier.isSynchronized(modifiers)); // false
System.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 A
Class 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"; }
@Override
public 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.ClassNotFoundException
Method ==> public java.lang.String tao.xiao.action.HelloJava.toString()
Method ==> public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
Method ==> public final void java.lang.Object.wait() throws java.lang.InterruptedException
Method ==> public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
Method ==> 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)