亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java反射機(jī)制(Reflection)淺析

 更新時間:2014年07月01日 08:55:42   投稿:junjie  
這篇文章主要介紹了Java反射機(jī)制(Reflection)淺析,本文以實例講解Java的反射機(jī)制,需要的朋友可以參考下

Reflection也就是反射,是Java語言的一個重要特征,我們知道,在使用一個類之前,我們往往都已經(jīng)創(chuàng)建好它了,比如創(chuàng)建一個類文件,然后再寫些屬性、方法等,也就是這種類是靜態(tài)的,但反射機(jī)制卻允許你動態(tài)地創(chuàng)建一個類。除了動態(tài)地創(chuàng)建一個類外,我們還能動態(tài)地獲取同類對象的數(shù)據(jù),并將這些數(shù)據(jù)賦給新創(chuàng)建的類,這有點類似克隆復(fù)制。在很多時候,我們都需要這種動態(tài)創(chuàng)建類的特征,比如在處理一些業(yè)務(wù),但這些業(yè)務(wù)卻又稍有區(qū)別的時候,往往對應(yīng)著多個類,在處理的時候,我們就要根據(jù)不同的業(yè)務(wù)處理來調(diào)用不同的類,這個時候反射機(jī)制就派上用場了。

以下是JDK API中關(guān)于軟件包java.lang.reflect的描述:

提供類和接口,以獲取關(guān)于類和對象的反射信息。在安全限制內(nèi),反射允許編程訪問關(guān)于加載類的字段、方法和構(gòu)造方法的信息,并允許使用反射字段、方法和構(gòu)造方法對對象上的基本對等項進(jìn)行操作。

如果必需的 ReflectPermission 可用,則 AccessibleObject 允許抑制訪問檢查。

Arrays 提供動態(tài)創(chuàng)建和訪問數(shù)組的靜態(tài)方法。

此包中的類以及 java.lang.Class 可以適應(yīng)以下應(yīng)用程序的需要:調(diào)試程序、解釋程序、對象檢查程序、類瀏覽程序,以及服務(wù)(比如,Object Serialization 和 JavaBean,它們需要訪問目標(biāo)對象(基于其運(yùn)行時類)的公共成員或給定類聲明的成員)。

下面通過兩個簡單例子來說明反射的用法,首先先創(chuàng)建一個Person類:

復(fù)制代碼 代碼如下:

package test;

public class Person {

private int age;

private String name = "";

private String[] arr = new String[2];

public Person(){}

public Person(String name,int age){
this.name = name;
this.age = age;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String[] getArr() {
return arr;
}

public void setArr(String[] arr) {
this.arr = arr;
}

}

實例1:得到Person類的屬性及方法信息

復(fù)制代碼 代碼如下:

private static void testSimpleReflect(){
String className = "test.Person";
try {
Class c = Class.forName(className);
Field[] fields = c.getDeclaredFields();
Method[] m = c.getDeclaredMethods();
for (Field field : fields){
System.out.println(field.getName());
}
for (Method method : m){
System.out.println(m.getClass());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

這種是非常簡單的,通過類所在包路徑來得到一個類,在實際的工作中,也是使用最多的。

實例2:對象復(fù)制

復(fù)制代碼 代碼如下:

@SuppressWarnings("unchecked")
public static Object copy(Object object) throws Exception {
// 獲得對象類型
Class classType = object.getClass();
System.out.println("" + classType.getName()); // 通過默認(rèn)構(gòu)造方法創(chuàng)建一個新的對象
Object objectCopy = classType.getConstructor(new Class[] {})
.newInstance(new Object[] {}); // 獲得對象的所有屬性
Field fields[] = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 獲得和屬性對應(yīng)的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1); // 獲得和屬性對應(yīng)的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1); // 獲得和屬性對應(yīng)的getXXX()方法
Method getMethod = classType.getMethod(getMethodName,
new Class[] {}); // 獲得和屬性對應(yīng)的setXXX()方法
Method setMethod = classType.getMethod(setMethodName,
new Class[] { field.getType() }); // 調(diào)用原對象的getXXX()方法
Object value = getMethod.invoke(object, new Object[] {});
System.out.println(fieldName + ":" + value); // 調(diào)用拷貝對象的setXXX()方法
setMethod.invoke(objectCopy, new Object[] { value });
}
return objectCopy;
}

利用反射來實現(xiàn)對象的復(fù)制,我們通常不用自己這么干,因為開源系統(tǒng)BeanUtils已經(jīng)替我們做好對象拷貝的封裝了,我們直接調(diào)用它的方法即可,但值得注意的是,BeanUtils也是基于反射機(jī)制來做的封裝

下面是一調(diào)用:

復(fù)制代碼 代碼如下:

public static void main(String[] args){
Person person = new Person("tom",22);
String[] strs = new String[]{"a","b"};
person.setArr(strs);
try {
Person p = (Person)copy(person);
System.out.println(p.getName()+">>"+p.getAge());
for (String str : p.getArr()){
System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
}
//        testSimpleReflect();
}

相關(guān)文章

  • java利用udp實現(xiàn)發(fā)送數(shù)據(jù)

    java利用udp實現(xiàn)發(fā)送數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了java利用udp實現(xiàn)發(fā)送數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 使用springboot通過spi機(jī)制加載mysql驅(qū)動的過程

    使用springboot通過spi機(jī)制加載mysql驅(qū)動的過程

    這篇文章主要介紹了使用springboot通過spi機(jī)制加載mysql驅(qū)動的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • ThreadLocal使用案例_動力節(jié)點Java學(xué)院整理

    ThreadLocal使用案例_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了ThreadLocal使用案例分析,需要的朋友可以參考下
    2017-08-08
  • maven-surefire-plugin總結(jié)示例詳解

    maven-surefire-plugin總結(jié)示例詳解

    這篇文章主要介紹了maven-surefire-plugin總結(jié),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實現(xiàn)

    Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實現(xiàn)

    這篇文章主要介紹了Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • java.lang.UnsatisfiedLinkError: %1 不是有效的Win32應(yīng)用程序錯誤解決

    java.lang.UnsatisfiedLinkError: %1 不是有效的Win32應(yīng)用程序錯誤解決

    這篇文章主要給大家介紹了關(guān)于java.lang.UnsatisfiedLinkError: %1 不是有效的Win32應(yīng)用程序錯誤的解決方法,文中介紹的非常詳細(xì),需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。
    2017-03-03
  • Spring?Cloud?+?Nacos?+?Seata整合過程(分布式事務(wù)解決方案)

    Spring?Cloud?+?Nacos?+?Seata整合過程(分布式事務(wù)解決方案)

    Seata 是一款開源的分布式事務(wù)解決方案,致力于在微服務(wù)架構(gòu)下提供高性能和簡單易用的分布式事務(wù)服務(wù),這篇文章主要介紹了Spring?Cloud?+?Nacos?+?Seata整合過程(分布式事務(wù)解決方案),需要的朋友可以參考下
    2022-03-03
  • Java調(diào)用Windows的DOS命令的方法

    Java調(diào)用Windows的DOS命令的方法

    這篇文章主要介紹了Java調(diào)用Windows的DOS命令的方法,其主要內(nèi)容思路是實現(xiàn)調(diào)用Windows的ipconfig命令,然后將輸出的信息通過IO流輸出到控制臺。有需要的小伙伴參考下
    2015-02-02
  • java愛心代碼完整示例(脫單必備)

    java愛心代碼完整示例(脫單必備)

    最近看到個好玩的,就是用代碼實現(xiàn)愛心的形狀,對于不懂編程的人來說,這是一個很好的玩的東西,這篇文章主要給大家介紹了關(guān)于java愛心代碼的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • Java org.w3c.dom.Document 類方法引用報錯

    Java org.w3c.dom.Document 類方法引用報錯

    這篇文章主要介紹了Java org.w3c.dom.Document 類方法引用報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論