《俗人筆記》之《反射》
反射
就是實現對類的內部構造方法,成員方法和成員屬性的操作
問題:為什麼可以這麼做呢,原因在於java檔案經編譯為class檔案,任一個class檔案都屬於Calss物件,而Class物件可以載入在記憶體中
獲取Class的三種方式:
Class clazz=User.class ; User user=new User() user.getClass; Class.forName(User)
作用:
1.建立物件:Object obj=clazz.newInstance(),在spring中的工廠模式中就是這原理
2.獲得構造方法:
所有構造方法,包括private:clazz.getDeclaredConstructs()
對應的:User u=clazz.getDeclaredConstructs(int.class,String.class);
暴力破解私有的要多加這一步:u.setAccessible(true)
Object obj=u.newInstance(18,“男”)
3.獲取成員方法:
所有成員方法,包括private:Method[] m=clazz.getDeclaredMethods()
對應方法:Method m=clazz.getDeclaredMethod(“addUser”,String.class)//名字和引數,無參就只寫名字
暴力破解私有的要多加這一步:m.setAccessible(true)
m.invoke(user,“錢始皇”),物件和方法引數;此時會實現addUser的操作,引數就是錢坤
4.獲取成員引數
Filed name=clazz.getFiled(“name”);
name.setAccessble()
name.set(user,“qk”)例項物件和值
擴充套件:
註解簡用
首先是自定義註解
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})//註解位置
@Retention(RetentionPolicy.RUNTIME)
//註解週期
@interface myAn {
String name();
int age() default 18;
}
@myAn(name = “qian”)//必須將引數寫全,如果有預設值,可以不再寫
int num;
//自定義註解
@myAn(name = “qian”, age = 20)
@myAn1(“wrer”)//引數有且只有一個value時可以直接寫值
public static void main(String[] args) {
}