天天看点

非深入探寻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)