Java反射機制 以及 method.invoke運用

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"。使用參數argsobj(底層方法的對象) 上指派該對象所表示方法的結果

 

方案二:

通過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=綠色

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章