Java通過反射呼叫類的完整結構
Java通過反射呼叫類的完整結構
Field、Method、Constructor、Superclass、Interface、Annotation
使用反射可以取得:
-
實現的全部介面
public Class<?>[] getInterfaces()
確定此物件所表示的類或介面實現的介面。 -
所繼承的父類
public Class<? Super T> getSuperclass()
返回表示此 Class 所表示的實體(類、介面、基本型別)的父類的 Class。 -
全部的構造器
public Constructor[] getConstructors()
返回此 Class 物件所表示的類的所有public構造方法。
public Constructor[] getDeclaredConstructors()
返回此 Class 物件表示的類宣告的所有構造方法。- Constructor類中:
取得修飾符: public int getModifiers();
取得方法名稱: public String getName();
取得引數的型別:public Class<?>[] getParameterTypes();
- Constructor類中:
-
全部的方法
public Method[] getDeclaredMethods()
返回此Class物件所表示的類或介面的全部方法
public Method[] getMethods()
返回此Class物件所表示的類或介面的public的方法- Method類中:
public Class<?> getReturnType()取得全部的返回值
public Class<?>[] getParameterTypes()取得全部的引數
public int getModifiers()取得修飾符
public Class<?>[] getExceptionTypes()取得異常資訊
- Method類中:
-
全部的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的名稱。
- Field方法中:
-
Annotation相關
get Annotation(Class annotationClass)
getDeclaredAnnotations() -
泛型相關
獲取父類泛型型別:Type getGenericSuperclass()
泛型型別:ParameterizedType
獲取實際的泛型型別引數陣列:getActualTypeArguments() -
類所在的包 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
}
}