1. 程式人生 > >Java通過反射呼叫類的完整結構

Java通過反射呼叫類的完整結構

Java通過反射呼叫類的完整結構


Field、Method、Constructor、Superclass、Interface、Annotation

使用反射可以取得:

  1. 實現的全部介面
    public Class<?>[] getInterfaces()
    確定此物件所表示的類或介面實現的介面。

  2. 所繼承的父類
    public Class<? Super T> getSuperclass()
    返回表示此 Class 所表示的實體(類、介面、基本型別)的父類的 Class。

  3. 全部的構造器
    public Constructor[] getConstructors()
    返回此 Class 物件所表示的類的所有public構造方法。
    public Constructor[] getDeclaredConstructors()
    返回此 Class 物件表示的類宣告的所有構造方法。

    • Constructor類中:
      取得修飾符: public int getModifiers();
      取得方法名稱: public String getName();
      取得引數的型別:public Class<?>[] getParameterTypes();
  4. 全部的方法
    public Method[] getDeclaredMethods()
    返回此Class物件所表示的類或介面的全部方法
    public Method[] getMethods()
    返回此Class物件所表示的類或介面的public的方法

    • Method類中:
      public Class<?> getReturnType()取得全部的返回值
      public Class<?>[] getParameterTypes()取得全部的引數
      public int getModifiers()取得修飾符
      public Class<?>[] getExceptionTypes()取得異常資訊
  5. 全部的Field
    public Field[] getFields()
    返回此Class物件所表示的類或介面的public的Field。
    public Field[] getDeclaredFields()
    返回此Class物件所表示的類或介面的全部Field。

    • Field方法中:
      public int getModifiers() 以整數形式返回此Field的修飾符
      public Class<?> getType() 得到Field的屬性型別
      public String getName() 返回Field的名稱。
  6. Annotation相關
    get Annotation(Class annotationClass)
    getDeclaredAnnotations()

  7. 泛型相關
    獲取父類泛型型別:Type getGenericSuperclass()
    泛型型別:ParameterizedType
    獲取實際的泛型型別引數陣列:getActualTypeArguments()

  8. 類所在的包 Package getPackage()

public class TestField {
	//獲取對應的執行時類的屬性
	@Test
	public void test1() {
		Class clazz = Person.class;
		//1. getFields():只能獲取執行類中極其父類中,宣告為public的
		Field[] fields = clazz.getFields();
		for (int i = 0; i < fields.length; i++) {
			System.out.println(fields[i]);
		}
		//2.getDeclaredFields():獲取執行時類宣告的所有方法
		Field[] fields1 = clazz.getDeclaredFields();
		for(Field f : fields1) {
			System.out.println(f.getName());
		}
	}
	//許可權修飾符 變數型別 變數名
	//獲取屬性的各個部分的內容
	@Test
	public void test2() {
		Class clazz = Person.class;
		Field[] fields1 = clazz.getDeclaredFields();
		for(Field f : fields1) {
			//1.獲取每個屬性的許可權修飾符
			int i = f.getModifiers();
			String str1 = Modifier.toString(i);
			System.out.println(str1);
			//2.獲取每個屬性變數型別
			Class type = f.getType();
			System.out.println(type.getName());
			//3.獲取屬性名
			System.out.println(f.getName());
			
		}
	}
}
public class TestMethod {
	//1.獲取執行時類的方法
	@Test
	public void test1() {
		Class clazz = Person.class;
		//1.getMethods(): 獲取執行時類及其父類所有的宣告為public的方法
		Method[] m1 = clazz.getMethods();
		for(Method m : m1) {
			System.out.println(m);
		}
		//2.getDeclaredMethods():獲取執行時類本身宣告的所有方法
		Method[] m2  = clazz.getDeclaredMethods();
		for(Method m : m2) {
			System.out.println(m);
		}
	}
	//註解 許可權修飾符 返回值型別 方法名 形參列表 異常
	@Test
	public void test2()	{
		Class clazz = Person.class;
		Method[] m2 = clazz.getDeclaredMethods();
		for(Method m : m2) {
			//1.註解
			Annotation[] ann = m.getAnnotations();
			for(Annotation a : ann) {
				System.out.println(a);
			}		
			//2.許可權修飾符
			String str = Modifier.toString(m.getModifiers());
			System.out.print(str + " ");
			//3.返回值型別
			Class returnType = m.getReturnType();
			System.out.print(returnType.getName()+" ");
			//4.方法名
			System.out.print(m.getName()+ "");
			//5.形參列表
			System.out.print("(");
			Class [] params = m.getParameterTypes();
			for (int i = 0; i < params.length; i++) {
				System.out.print(params[i].getName()+" args-"+ i+ " ");
			}
			System.out.print(")");
			//6.異常型別
			Class[] exps = m.getExceptionTypes();
			for (int i = 0; i < exps.length; i++) {
				System.out.print(exps[i].getName()+" exps-"+ i+ " ");
			}
			System.out.println();
		}
	}
}
	@Test
	public void test2() throws Exception {
		String className = "testReflection.Person";
		Class clazz = Class.forName(className);
		
		Constructor[] cons = clazz.getDeclaredConstructors();
		for(Constructor c : cons) {
			System.out.println(c);
		}
	}
public class TestOthers {
	//6.獲取註解
	public void test6() {
		Class clazz = Person.class;
		Annotation [] anns = clazz.getAnnotations();
		for(Annotation ann : anns) {
			System.out.println(ann);
		}
	}
	//5.獲取所在的包
	@Test
	public void test5() {
		Class clazz = Person.class;
		Package pack = clazz.getPackage();
		System.out.println(pack);//package testReflection
	}
	
	//4.獲取實現的介面
	@Test
	public void test4() {
		Class clazz = Person.class;
		Class[] interfaces = clazz.getInterfaces();
		for(Class i : interfaces) {
			System.out.println(i);
			/*
			 * interface java.lang.Comparable
			   interface testReflection.MyInterface
			 */
		}
	}
	//3.獲取父類符泛型
	@Test
	public void test3() {
		Class clazz = Person.class;
		Type type1 = clazz.getGenericSuperclass();
		ParameterizedType param = (ParameterizedType)type1;
		Type[] ars = param.getActualTypeArguments();
		System.out.println(((Class)ars[0]).getTypeName());//java.lang.String
	}
	
	//2獲取帶泛型的父類
	@Test
	public void test2() {
		Class clazz = Person.class;
		Type type1 = clazz.getGenericSuperclass();
		System.out.println(type1);//testReflection.Creature<java.lang.String>

		
	}
	//1.獲取執行時類的父類
	@Test
	public void test() {
		Class clazz = Person.class;
		Class superClass =  clazz.getSuperclass();
		System.out.println(superClass);//class testReflection.Creature
	}
}