天天看點

非深入探尋Java反射機制 (Class)Classes

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)