package 反射;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;public class demo {public static void main(String[] args) throws Exception {// 通過類的全限定名獲取對應的 Class 對象Class clazz = Class.forName("反射.Cat");// 獲取類中聲明的所有字段,包括私有、受保護和默認訪問權限的字段Field[] fields = clazz.getDeclaredFields();// 打印所有聲明的字段System.out.println(Arrays.toString(fields));// 獲取名為 "age" 的聲明字段Field ageFiled = clazz.getDeclaredField("age");// 打印該字段信息System.out.println(ageFiled);// 獲取名為 "name" 的聲明字段Field nameFiled = clazz.getDeclaredField("name");// 打印該字段信息System.out.println(nameFiled);// 獲取名為 "color" 的聲明字段Field colorFiled = clazz.getDeclaredField("color");// 打印該字段信息System.out.println(colorFiled);// 獲取名為 "height" 的聲明字段Field heightFiled = clazz.getDeclaredField("height");// 打印該字段信息System.out.println(heightFiled);// 以下代碼注釋掉,因為 getField 方法只能獲取公共字段,而 name 和 age 是私有字段,調用會報錯
// Field[] fields1 = clazz.getFields();
// System.out.println(Arrays.toString(fields1));
// Field nameFiled1 = clazz.getField("name");
// System.out.println(nameFiled1);
// Field ageFiled1 = clazz.getField("age");
// System.out.println(ageFiled1);// 獲取類中聲明的所有方法,包括私有、受保護和默認訪問權限的方法Method[] methods = clazz.getDeclaredMethods();// 打印所有聲明的方法System.out.println(Arrays.toString(methods));// 獲取名為 "run" 且參數類型為 String 的聲明方法Method runMethod1 = clazz.getDeclaredMethod("run", String.class);// 打印該方法信息System.out.println(runMethod1);// 獲取名為 "run" 且參數類型為 String 的公共方法Method runMethod2 = clazz.getMethod("run", String.class);// 打印該方法信息System.out.println(runMethod2);// 獲取名為 "fly" 的聲明方法Method flyMethod1 = clazz.getDeclaredMethod("fly");// 打印該方法信息System.out.println(flyMethod1);// 獲取類的所有公共構造函數Constructor[] constructors = clazz.getConstructors();// 打印所有公共構造函數System.out.println(Arrays.toString(constructors));// 獲取類的所有聲明的構造函數,包括私有、受保護和默認訪問權限的構造函數Constructor[] constructors1 = clazz.getDeclaredConstructors();// 打印所有聲明的構造函數System.out.println(Arrays.toString(constructors1));// 獲取無參的聲明構造函數Constructor constructor2 = clazz.getDeclaredConstructor();// 打印該構造函數信息System.out.println(constructor2);// 獲取參數類型為 String 的聲明構造函數Constructor constructor4 = clazz.getDeclaredConstructor(String.class);// 打印該構造函數信息System.out.println(constructor4);// 獲取無參的公共構造函數Constructor constructor3 = clazz.getConstructor();// 打印該構造函數信息System.out.println(constructor3);// 獲取類實現的所有接口Class[] classes = clazz.getInterfaces();// 打印類實現的所有接口System.out.println(Arrays.toString(classes));}
}
package 反射;
public class Cat implements A,B{private int age;private String name;protected String color;double height;public Cat(String name, String color, double height) {this.name = name;this.color = color;this.height = height;}public Cat() {}public Cat(String color) {this.color = color;}public void run(String name) {System.out.println("小貓的名字叫"+name); }private int setAge(int age) {return age; }void fly() {System.out.println("貓不回飛");}
}
1.?Class.forName("反射.Cat")
此方法能夠依據類的全限定名獲取對應的?Class
?對象。Class
?對象代表著 Java 中的類或者接口,借助它能夠在運行時獲取類的相關信息。
2.?clazz.getDeclaredFields()
該方法會返回一個?Field
?數組,其中包含類里聲明的全部字段,涵蓋私有、受保護以及默認訪問權限的字段。
3.?clazz.getDeclaredField("fieldName")
此方法可獲取類中指定名稱的聲明字段,無論其訪問權限怎樣。
4.?clazz.getFields()
這個方法返回一個?Field
?數組,其中僅包含類的公共字段。
5.?clazz.getField("fieldName")
該方法用于獲取類中指定名稱的公共字段。
6.?clazz.getDeclaredMethods()
此方法會返回一個?Method
?數組,其中包含類里聲明的全部方法,涵蓋私有、受保護以及默認訪問權限的方法。
7.?clazz.getDeclaredMethod("methodName", parameterTypes)
該方法可獲取類中指定名稱和參數類型的聲明方法,無論其訪問權限如何。
8.?clazz.getMethod("methodName", parameterTypes)
此方法用于獲取類中指定名稱和參數類型的公共方法。
9.?clazz.getConstructors()
這個方法返回一個?Constructor
?數組,其中僅包含類的公共構造函數。
10.?clazz.getDeclaredConstructors()
該方法會返回一個?Constructor
?數組,其中包含類里聲明的全部構造函數,涵蓋私有、受保護以及默認訪問權限的構造函數。
11.?clazz.getDeclaredConstructor(parameterTypes)
此方法可獲取類中指定參數類型的聲明構造函數,無論其訪問權限怎樣。
12.?clazz.getConstructor(parameterTypes)
該方法用于獲取類中指定參數類型的公共構造函數。
13.?clazz.getInterfaces()
這個方法返回一個?Class
?數組,其中包含類實現的所有接口。
?