Java的反射機(jī)制一起來看看
一、什么是反射機(jī)制?
反射就是運(yùn)行時(shí)識(shí)別類的能力,在運(yùn)行時(shí)可以獲得當(dāng)前對象的類結(jié)構(gòu),動(dòng)態(tài)創(chuàng)建類的實(shí)例,調(diào)用對象的方法等;
獲得Class類對象的三種方式:
方式一 :Class.forName(“類名”);
Class類的一個(gè)靜態(tài)方法forName 加載類獲得類對象 運(yùn)行的類庫中沒有Person類,程序依然可以編譯。
Class cls = Class.forName("com.oracle.vo.Person");方式二: 類名.class
要求運(yùn)行的類庫一定要有Person類
//編譯的字節(jié)碼文件中,會(huì)為每個(gè)類 定義一個(gè)靜態(tài)的屬性class 類型是Class類型 //會(huì)為每個(gè)類定義一個(gè)屬性,存儲(chǔ)自己類的類對象 Class cls = Person.class;
方式三: 對象.getClass()
要求運(yùn)行的類庫中一定要有Person類 當(dāng)持有了一個(gè)對象時(shí),可以根據(jù)對象獲得其類對象
Person p = new Person(); //getClass方法是Object類的方法,所有的對象都有g(shù)etClass方法 Class cls = p.getClass();
二、Class類
API方法
1. getName() 獲得類對象對應(yīng)類的類名(全類名:包名+類名)
2. getSimpleName() 獲得類對象對應(yīng)類的類名
3. getPackage() 獲得類對象對應(yīng)類的包對象
try {
Class cls = Class.forName("com.oracle.vo.Person");
System.out.println(cls.getName());
System.out.println(cls.getSimpleName());
Package page = cls.getPackage();
System.out.println(page.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}4. getField(String name) 根據(jù)名字獲得能訪問的屬性。
5. getDeclaredField(String name) 根據(jù)名字獲得屬性。
6. getDeclaredFields() 獲得所有的屬性
7. getDeclaredMethod()
8. getDeclaredConstructor(Class... types) 根據(jù)參數(shù)列表獲得構(gòu)造器
9. newInstance() 通過無參構(gòu)造器創(chuàng)建對象
10. getSuperClass() 獲得父類的類對象
三、Package類
Package對象抽象為包
四、Field類
是屬性的抽象,F(xiàn)ield類的實(shí)例就是某個(gè)屬性,F(xiàn)ield類包括了屬性名、屬性類型、屬性值、修飾范圍等。
獲得屬性對象,主要的作用是對屬性進(jìn)行賦值或取值的操作。
1. get(Object obj) 返回Object :獲得某個(gè)對象的屬性值。
2. setAccessible(boolean flag) : 設(shè)置屬性是否可訪問。
3. set(Object obj,Object value) : 設(shè)置屬性值
public static void main(String[] args) {
//獲得Person的類對象 ,獲得Person的Class對象
Person p = new Person();
p.setName("tom");
try {
Class cls = Class.forName("com.oracle.vo.Person");
//獲得Person類中所有的屬性
Field[] fields = cls.getFields();
//獲得Person類中的name屬性
Field field = cls.getDeclaredField("name");
System.out.println(field.getName());
//獲得 某個(gè)Person對象 的name屬性值
//field: Person類的name屬性
//設(shè)置這個(gè)屬性可訪問,忽略修飾范圍
field.setAccessible(true);
//設(shè)置p對象的name屬性值 為jack
field.set(p, "jack");
System.out.println(field.get(p));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}五、Method類
invoke(Object obj, Object ... args) 返回Object : 執(zhí)行method方法
public static void main(String[] args) {
//獲得Person的類對象 ,獲得Person的Class對象
Person p = new Person();
p.setName("tom");
try {
Class cls = Class.forName("com.oracle.vo.Person");
//獲得Person類的 method(String name) 方法對象
Method method1 = cls.getDeclaredMethod("method", String.class);
//獲得Person類的 method() 方法對象
Method method2 = cls.getDeclaredMethod("method");
//method(int i,String name) 方法對象
Method method3 = cls.getDeclaredMethod("method",int.class,String.class);
//獲得全部方法
Method[] methods = cls.getDeclaredMethods();
//獲得方法要作什么? 就是要調(diào)用方法
//obj參數(shù): 調(diào)用哪個(gè)對象的方法
method1.invoke(p, "abc");
System.out.println(method3.invoke(p, 10,"abcd"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}六、Constructor類
newInstance(Object ... args) 調(diào)用構(gòu)造器創(chuàng)建對象
public static void main(String[] args) {
//獲得Person的類對象 ,獲得Person的Class對象
Person p = new Person();
p.setName("tom");
try {
Class cls = Class.forName("com.oracle.vo.Person");
//獲得 public Person() 構(gòu)造器
Constructor constructor1 = cls.getDeclaredConstructor();
//public Person(String name, int age) 構(gòu)造器
Constructor constructor2 = cls.getDeclaredConstructor(String.class,int.class);
//獲得構(gòu)造器的作用,要調(diào)用構(gòu)造器創(chuàng)建對象
Object obj1 = constructor1.newInstance();
Object obj2 = constructor2.newInstance("tom",20);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
springboot + mybatis-plus實(shí)現(xiàn)多表聯(lián)合查詢功能(注解方式)
這篇文章主要介紹了springboot + mybatis-plus實(shí)現(xiàn)多表聯(lián)合查詢功能,是最簡單的一種注解方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Java監(jiān)聽器三種實(shí)現(xiàn)方法代碼解析
這篇文章主要介紹了Java監(jiān)聽器三種實(shí)現(xiàn)方法代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Java中JSON字符串反序列化(動(dòng)態(tài)泛型)
文章討論了在定時(shí)任務(wù)中使用反射調(diào)用目標(biāo)對象時(shí)處理動(dòng)態(tài)參數(shù)的問題,通過將方法參數(shù)存儲(chǔ)為JSON字符串并進(jìn)行反序列化,可以實(shí)現(xiàn)動(dòng)態(tài)調(diào)用,然而,這種方式容易導(dǎo)致內(nèi)存溢出(OOM),這篇文章主要介紹了JSON字符串反序列化?動(dòng)態(tài)泛型,需要的朋友可以參考下2024-12-12
Java線程休眠_(dá)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
sleep() 的作用是讓當(dāng)前線程休眠,即當(dāng)前線程會(huì)從“運(yùn)行狀態(tài)”進(jìn)入到“休眠(阻塞)狀態(tài)”。下面通過實(shí)例代碼給大家介紹Java線程休眠的知識(shí),需要的朋友參考下吧2017-05-05
Spring中使用JSR303請求約束判空的實(shí)現(xiàn)
這篇文章主要介紹了Spring中使用JSR303請求約束判空的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
解決BeanUtils.copyProperties無法成功封裝的問題
這篇文章主要介紹了解決BeanUtils.copyProperties無法成功封裝的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

