摘要: 在java編程中,咱們常常不知道傳入本身方法中的實體類中到底有哪些方法,或者,咱們須要根據用戶傳入的不一樣的屬性來給對象設置不一樣的屬性值,那麼,java自帶的反射機制能夠很方便的達到這種目的,同時,又能夠讓咱們省掉不少單純靠分析傳入的屬性值來決定給實體對象設置哪些屬性的值。java
JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。web
JAVA反射(放射)機制:「程序運行時,容許改變程序結構或變量類型,這種語言稱爲動態語言」。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。可是JAVA有着一個很是突出的動態相關機制:Reflection,用在Java身上指的是咱們能夠於運行時加載、探知、使用編譯期間徹底未知的classes。換句話說,Java程序能夠加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。編程
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; } }
原文出處:post
[1] 碼上中國博客, java 中利用反射機制獲取和設置實體類的屬性值, https://mp.csdn.net/posteditthis