程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java反射機制(Reflection)淺析

Java反射機制(Reflection)淺析

編輯:關於JAVA

Java反射機制(Reflection)淺析。本站提示廣大學習愛好者:(Java反射機制(Reflection)淺析)文章只能為提供參考,不一定能成為您想要的結果。以下是Java反射機制(Reflection)淺析正文


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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved