一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java反射機制(Reflection)淺析

Java反射機制(Reflection)淺析

2019-11-24 15:21junjie JAVA教程

這篇文章主要介紹了Java反射機制(Reflection)淺析,本文以實例講解Java的反射機制,需要的朋友可以參考下

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

以下是JDK API中關于軟件包java.lang.reflect的描述:

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

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

Arrays 提供動態創建和訪問數組的靜態方法。

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

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

復制代碼代碼如下:


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類的屬性及方法信息

復制代碼代碼如下:

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:對象復制

復制代碼代碼如下:

 

@SuppressWarnings("unchecked")
public static Object copy(Object object) throws Exception {
// 獲得對象類型
Class classType = object.getClass();
System.out.println("" + classType.getName()); // 通過默認構造方法創建一個新的對象
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(); // 獲得和屬性對應的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1); // 獲得和屬性對應的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1); // 獲得和屬性對應的getXXX()方法
Method getMethod = classType.getMethod(getMethodName,
new Class[] {}); // 獲得和屬性對應的setXXX()方法
Method setMethod = classType.getMethod(setMethodName,
new Class[] { field.getType() }); // 調用原對象的getXXX()方法
Object value = getMethod.invoke(object, new Object[] {});
System.out.println(fieldName + ":" + value); // 調用拷貝對象的setXXX()方法
setMethod.invoke(objectCopy, new Object[] { value });
}
return objectCopy;
}

 

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

下面是一調用:

復制代碼代碼如下:

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();
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女奶口隐私免费视频网站 | 青草久久影院 | 韩国理论三级在线观看视频 | 精品视频一区二区三区免费 | а天堂中文最新版在线官网视频 | 91爱爱网站| 农村老妇1乱69系列小说 | 俄罗斯引擎首页进入 | 91成人爽a毛片一区二区 | 91制片厂果冻星空传媒3xg | 久久99国产亚洲高清观着 | 女张腿男人桶羞羞漫画 | 国产欧美一区二区三区精品 | 久久精品国产清白在天天线 | 国产精品合集久久久久青苹果 | 亚洲精品久久久WWW游戏好玩 | 日本中文字幕二区三区 | 国产欧美日韩在线播放 | 久久99r66热这里有精品 | 国产无限免费观看黄网站 | 亚洲AV无码A片在线观看蜜桃 | 精品国产国产综合精品 | 大象传媒免费网址 | 激情综合站 | 91精品国产高清久久久久久io | 嗯啊视频在线 | 国产九九 | 人禽l交视频在线播放 视频 | 性色xxx| 人人最怕九月羊 | 亚洲精品第五页 | ts人妖另类国产 | 成人欧美一区二区三区 | 99久久综合给久久精品 | 91破解版| 17岁韩国在线观看免费1 | 天天天天天干 | 久久成人国产精品一区二区 | 国产精品久久久久一区二区三区 | 美女和男生搞基 | 久久人妻熟女中文字幕AV蜜芽 |