JAVA反射機制
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。
方案一:
在java web 開發中,我們經常會遇到,從後臺獲取前臺的值,將獲取的值通過set方法賦值給實體,然後將實體存入數據庫中,所以針對這點,我們可以通過method反射機制,寫個通用的底層方法(對任何實體都有效),這樣一來,我們就不用再去一個一個set到實體中去。
Java反射通過set、get封裝到實體Bean中
Textentity 實體類
public class TextEntity {
private Integer num;
private String red;
private String green;
。。。get set方法
}
MethodReflect 測試類
public class MethodReflect {
public static void main(String[] args) throws Exception{
TextEntity text = new TextEntity();
text.setGreen("綠色");
text.setRed("紅色");
Exttools(text);
}
public static void Exttools(Object obj)throws Exception{
boolean flag = true;
Field[] file = obj.getClass().getDeclaredFields();
for(Field files :file){
String name = files.getName();
//將第一個字母大寫,好進行get和set
String nameCase = name.substring(0, 1).toUpperCase()+name.substring(1);
Method get_method = obj.getClass().getMethod("get"+nameCase);//獲取getMethod方法
Method set_method = obj.getClass().getMethod("set"+nameCase,get_method.getReturnType());////獲得屬性set方法
Class<?> c = get_method.getReturnType();
if("java.lang.String".equals(c.getName())){
set_method.invoke(obj,"123");//set參數
}
System.out.println("name="+nameCase+",invoke="+get_method.invoke(obj));
}
}
}
我們在調用Exttools方法之前,set了TextEntity類,但是我們又進行了invoke,值就改變了。所以輸出來的結果是:
name=Num,invoke=0
name=Red,invoke=123
name=Green,invoke=123
=================================================================================
obj.getClass() 得到該對象的class;
Field[] file = obj.getClass().getDeclaredFields();返回此類所有已聲明字段的 Field
對象的數組。讓Field獲得對象中所有的字段。
TextEntity是一個類,getNum()、getRed()和getGreen()是該類中的方法,現在通過Class類的getMethod方法獲得獲得這三個方法屬性。
Method m = TextEntity.class.getMethod("getNum");//獲得TextEntity類中的公共方法
這裏的class是一個字段,表示這個類對應的Class類的對象,再調用其中的getMethod(name
- 方法名)返回的是類中指定方法名。
Method.invoke(obj,"123");//執行該Method.invoke方法的參數,意思是執行這個方法的對象obj(),和參數"123"。使用參數args
在
obj(底層方法的對象)
上指派該對象所表示方法的結果
方案二:
通過Java反射進行實體Bean非空判斷
同上Textentity 實體類
MethodReflect 測試類
public class MethodReflect {
public static void main(String[] args) throws Exception{
TextEntity text = new TextEntity();
text.setGreen("綠色");
text.setRed("紅色");
Exttools(text);
}
public static void Exttools(Object obj)throws Exception{
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
String name = fields[i].getName();
// 將屬性的首字符大寫,方便構造get,set方法
name = name.substring(0, 1).toUpperCase() + name.substring(1);
Method m = obj.getClass().getMethod("get" + name);
System.out.println("name="+name+" invoke="+m.invoke(obj));
if (null == m.invoke(obj) || "".equals(m.invoke(obj))) {
if("Green".equals(name)){
System.out.println("綠色爲空");
}else if("Num".equals(name)){
System.out.println("數字爲空");
}
}
}
}
}
輸出結果:
name=Num invoke=null
數字爲空
name=Red invoke=紅色
name=Green invoke=綠色