Class類是Reflection API中核心的類,他位于Java.lang.Class
列出一些常用的方法。
- getName() : 獲得類的完整名字
- getFields() : 獲得類的public類型的屬性
- getDeclaredFields() : 獲得類的所有屬性
- getMethods() : 獲得類的public類型的方法
- getDeclaredMethods() : 獲得類的所有方法
- getMethod(String name, Class[] parameterTypes) : 擷取類的特定方法(name參數指定方法名字,parameterTypes參數指定方法參數類型)
- getConstructors() : 獲得類的public類型的構造方法
- getConstructor(Class[] parameterTypes) : 獲得類的特定構造方法(parameterTypes參數指定構造方法的參數類型)
- newInstance() : 通過類的不帶參數的構造方法建立這個類的一個對象
如果想使用反射,有2個關鍵的部分
1.擷取Class對象
2.獲得對象執行個體
下面來介紹這兩個部分:
1.如何擷取Class對象
擷取某個類或某個對象所對應的Class對象的常用的3種方法
a) 使用Class類的靜态方法forName:
Class.forName("java.lang.String");
b) 使用類的.class文法:
String.class;
c) 使用對象的getClass()方法(java.lang.Object類中的方法):
String s = "aa";
Class<?> clazz = s.getClass();
2.如何獲得對象執行個體
大家都知道獲得對象執行個體就是去new一個,其實就是調用對象的構造方法
這裡将調用構造方法參數的不同分為兩種類型:
a)調用無參數的構造方法:
1.調用Class對象的newInstance()方法:
Class<?> classType = ClassClass.forName("java.lang.String");
Object object = classTpye.newInstance();
2.調用Class對象的Constructor對象的newInstance()方法,傳遞一個空的Class對象數組作為參數:
Constructor cons = classType.getConstructor(new Class[]{});
Object object =cons.newInstance(new Object[]{});
b)調用有參數的構造方法:
1.調用Class對象的Constructor對象的newInstance()方法,傳遞一個可變長的Class對象數組作為參數,本例傳遞String,int兩個參數:
Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});
Object object =
cons.newInstance(new Object[]{"hello",3});
下面來一個小Demo,由于過于簡單這裡就隻貼代碼了
這個demo簡單的實作了上面介紹的一些關于反射的用法,算是一個複習鞏固:
[java] view plain copy print?
class Person {
private long id;
private int age;
private String name;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
@Override
public String toString() {
return "Name="+getName()+" Age="+getAge()+" Id="+getId();
public long getId() {
return id;
public void setId(long id) {
this.id = id;
public int getAge() {
return age;
public void setAge(int age) {
public String getName() {
return name;
public void setName(String name) {
}
很簡單的一個自定義類,兩個構造方法,和一些get,set方法,還有一個重寫的toString
下面是調用反射的main方法中的代碼,主要就是用反射的方法調用Person的帶參構造方法給age,name指派,在調用setId給id指派,最後調用toString方法列印出結果
public static void main(String[] args) throws Exception {
//擷取Person類的Class對象
Class<?> classType = Class.forName("Person");
//調用Person類的兩個參數構造方法生成對象
Constructor constructor = classType.getConstructor(new Class[]{String.class, int.class});
Object object = constructor.newInstance(new Object[]{"Dean",25});
//擷取setId方法
Method setId = classType.getMethod("setId", new Class[]{long.class});
//調用setId方法設定Id
setId.invoke(object, new Object[]{10});
//調用toString輸出結果
Method toString = classType.getMethod("toString", new Class[]{});
String result = (String) toString.invoke(object, new Object[]{});
System.out.println(result);
輸出結果為:Name=Dean Age=25 Id=10
最近正在看反射的視訊和資料,寫這個博文的目的就是對于學習的一個總結吧。
陸續可能會更新一些我總結的更深層的反射知識,希望大家支援