JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。java
JAVA反射(放射)機制:「程序運行時,容許改變程序結構或變量類型,這種語言稱爲動態語言」。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。可是JAVA有着一個很是突出的動態相關機制:Reflection,用在Java身上指的是咱們能夠於運行時加載、探知、使用編譯期間徹底未知的classes。換句話說,Java程序能夠加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。web
Java反射機制主要提供瞭如下功能: 在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具備的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。app
下面咱們就拿一個實際的例子來闡述運用java的反射機制來達到設置和獲取一個實體類的屬性值的方法。
webapp
package com.ultrapower.ultracmdb.inventory.webapp.component.special.modelManager.util; import java.lang.reflect.Field; public class TestInvoke { @SuppressWarnings("rawtypes") public static void main(String args[]) throws IllegalArgumentException, IllegalAccessException { Perpole bean = new Perpole(); // 獲得類對象 Class userCla = (Class) bean.getClass(); /* * 獲得類中的全部屬性集合 */ Field[] fs = userCla.getDeclaredFields(); for(int i = 0;i < fs.length;i++) { Field f = fs[i]; f.setAccessible(true); // 設置些屬性是能夠訪問的 Object val = f.get(bean);// 獲得此屬性的值 System.out.println("name:" + f.getName() + "\t value = " + val); String type = f.getType().toString();// 獲得此屬性的類型 if(type.endsWith("String")) { System.out.println(f.getType() + "\t是String"); f.set(bean,"caocao"); // 給屬性設值 } else if(type.endsWith("int") || type.endsWith("Integer")) { System.out.println(f.getType() + "\t是int"); f.set(bean,12); // 給屬性設值 } else { System.out.println(f.getType() + "\t"); } } System.out.println("======================================"); System.out.println("設置後的bean的值爲:\n"+bean.getName()+"\t"+bean.getAge()); } } class Perpole { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
同時歡迎朋友們加入個人QQ羣交流問題:129113306this