簡(jiǎn)單總結(jié)Java的反射機(jī)制的運(yùn)用
Java 的反射機(jī)制是使其具有動(dòng)態(tài)特性的非常關(guān)鍵的一種機(jī)制,也是在JavaBean 中廣泛應(yīng)用的一種特性。
簡(jiǎn)單來(lái)說(shuō),一個(gè)類或者一個(gè)對(duì)象是擁有下面幾種屬性的:
Method,Constructor,Field,其大致結(jié)構(gòu)類圖如下:

我們現(xiàn)在用代碼來(lái)說(shuō)明問(wèn)題:
首先,我們看Class類,在Class類中,我們可以看見(jiàn)下面的幾個(gè)重要的方法;
- getInterfaces()
- getSuperClass();
- isInterface();
這是用來(lái)得到一個(gè)類的接口或者超類,以及判斷這個(gè)類是不是一個(gè)接口;
- forName(String className);根據(jù)一個(gè)類名得到一個(gè)相應(yīng)的類類型;
- getClassLoader();得到這個(gè)類相應(yīng)的類加載器;
以及下面的幾種方法:
getField(Method/Constructor)(s)(name); getDeclaredField(Method/Constructor)(s)();
分別是獲取這個(gè)類的相應(yīng)的Constructor,field,method的;
區(qū)別在于,含有Declared的方法能夠得到這個(gè)類所聲明的所有的屬性,而沒(méi)有Declared的只能得到公共public的屬性;
而繼承了Member分別賦予了這個(gè)三個(gè)類能夠得到聲明其的Class,用getDeclaringClass();在這里我們?cè)俅谓榻B一下Modifiers,我們都知道在field或者Constructor,Method前面都含有若干修飾符,如:
public static final String name="corey";
等等,我們應(yīng)用getModifiers()能夠拿到這個(gè)修飾符的一個(gè)整形值,然后應(yīng)用Modifier這個(gè)類的靜態(tài)方法來(lái)進(jìn)行判斷;如:
Modifier.isStatic(int)等等;
接下來(lái),我們來(lái)看看AccessibleObject的幾個(gè)主要的方法,AccessibleObject中主要的幾個(gè)方式第一是
getAnnotation();得到某個(gè)屬性的注釋;
isAccessible();能否訪問(wèn);如果不能訪問(wèn),我們可以采取setAccessible(boolean)來(lái)設(shè)置其的可訪問(wèn)性;(這個(gè)我們?cè)趕pring中看到過(guò));
然后我們分別來(lái)看看這個(gè)三個(gè)類一些重要的特性:
Constructor:
- newInstance(args):能夠使用這個(gè)構(gòu)造器得到一個(gè)類的實(shí)例;
Field:
- getType();得到這個(gè)字段的類;
- set/get(Object,value):一系列的基本類型字段的設(shè)置方法或者Object的設(shè)置方法;
Method:
- getParameterTypes();得到所有參數(shù)的類型;
- getExceptionTypes();得到所有拋出異常的類型;
- invoke(Object,args);調(diào)用Object對(duì)象的這個(gè)方法,參數(shù)是args;
下面是一份實(shí)例代碼:
package org.corey.demo;
public interface IName {
public String getFirstName();
public void setFirstName(String firstName);
public String getLastName();
public void setLastName(String lastName);
}
package org.corey.demo;
public class Name {
private String firstName;
private String lastName;
public String publicName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public Name() {
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
package org.corey.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
try {
Class clazz = Class.forName("org.corey.demo.Name");
Constructor con = clazz.getDeclaredConstructor(new Class[] {
String.class, String.class });
Name corey = (Name)(con.newInstance("corey", "zhou"));
System.out.println(corey.getFirstName()+" "+corey.getLastName());
Field[] fields=clazz.getDeclaredFields();
for(int index=0;index<fields.length;index++){
System.out.println(fields[index].getName()+" accessible "+fields[index].isAccessible());
}
Method[] methods=clazz.getDeclaredMethods();
for(int index=0;index<methods.length;index++){
System.out.println(methods[index].getName());
}
Field field=clazz.getDeclaredField("firstName");
if(!field.isAccessible()){
field.setAccessible(true);
field.set(corey, "syna");
}
Method method=clazz.getDeclaredMethod("setLastName", new Class[]{String.class});
method.invoke(corey, "wang");
System.out.println(corey.getFirstName()+" "+corey.getLastName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
console:
corey zhou firstName accessible false lastName accessible false publicName accessible false getFirstName getLastName setLastName setFirstName syna wang
相關(guān)文章
SpringBoot集成Aviator實(shí)現(xiàn)參數(shù)校驗(yàn)的代碼工程
Aviator是一個(gè)高性能、輕量級(jí)的java語(yǔ)言實(shí)現(xiàn)的表達(dá)式求值引擎,主要用于各種表達(dá)式的動(dòng)態(tài)求值,本文給大家詳細(xì)介紹了SpringBoot集成Aviator實(shí)現(xiàn)參數(shù)校驗(yàn)的方法,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-11-11
springboot連接不同數(shù)據(jù)庫(kù)的寫(xiě)法詳解
這篇文章主要介紹了springboot連接不同數(shù)據(jù)庫(kù)的寫(xiě)法?,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Mybatis多個(gè)字段模糊匹配同一個(gè)值的案例
這篇文章主要介紹了Mybatis多個(gè)字段模糊匹配同一個(gè)值的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
SpringBoot框架實(shí)現(xiàn)切換啟動(dòng)開(kāi)發(fā)環(huán)境和測(cè)試環(huán)境
這篇文章主要介紹了SpringBoot框架實(shí)現(xiàn)切換啟動(dòng)開(kāi)發(fā)環(huán)境和測(cè)試環(huán)境,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
scala+redis實(shí)現(xiàn)分布式鎖的示例代碼
這篇文章主要介紹了scala+redis實(shí)現(xiàn)分布式鎖的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Java內(nèi)存模型之重排序的相關(guān)知識(shí)總結(jié)
重排序是指編譯器和處理器為了優(yōu)化性能而對(duì)指令序列進(jìn)行重新排序的一種手段,文中詳細(xì)介紹了Java重排序的相關(guān)知識(shí),需要的朋友可以參考下2021-06-06
Java使用Spring JdbcTemplate向in語(yǔ)句中傳遞參數(shù)的教程詳解
這篇文章主要給大家介紹Java如何使用Spring JdbcTemplate向in語(yǔ)句中傳遞參數(shù),文中有詳細(xì)的流程步驟和代碼示例,需要的朋友可以參考下2023-07-07

