1. 程式人生 > >Java反射機制獲取/呼叫類的屬性和方法

Java反射機制獲取/呼叫類的屬性和方法

      Java反射機制主要提供了以下功能: 在執行時判斷任意一個物件所屬的類;在執行時構造任意一個類的物件;在執行時判斷任意一個類所具有的成員變數和方法;在執行時呼叫任意一個物件的方法;生成動態代理。

public class Message {
	public static final String CODE_0000 = "錯誤碼0000";
	public static final String CODE_0001 = "錯誤碼0001";
	public static final String CODE_0002 = "錯誤碼0002";
	public static final String CODE_0003 = "錯誤碼0003";

	public Message(String a){
		this.getMessageMethod("hello");
	}
	public Message(){
		this.getMessageMethod("nothing");
	}
	public String getMessageMethod(String param) {
		return "this is getMessageMethod.and param is " + param;
	}

	public String getMessageMethod(String param, int i) {
		return "this is getMessageMethod.Param is " + param + "," + i;
	}
}

測試類:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) throws Exception {
		Class clazz=Class.forName("test.Message");// 這裡寫清楚包名.類名,否則會找不到
		
		System.out.println("---↓---Value-Of-\"CODE_0000\"---↓---");  
		Object obj=clazz.newInstance();
		Field fid=clazz.getField("CODE_0000");
		System.out.println(fid.get(obj));
		
		System.out.println("--↓--Use-Method-\"getMessageMethod(String)\"--↓--");  
        String methodName = "getMessageMethod";
        Method method = clazz.getMethod(methodName,String.class);
        Object  value = method.invoke(clazz.newInstance(),"hello");
        System.out.println( value.toString());  
        
		System.out.println("--↓--Use-Method-\"getMessageMethod(String,int)\"--↓--");  
        method = clazz.getMethod(methodName,String.class,int.class);
        value = method.invoke(clazz.newInstance(),"hello",2);
        System.out.println( value.toString()); 
        
        System.out.println("---↓---getDeclaredFields---↓---");  
		Field[] fields=clazz.getDeclaredFields();
		for(int i=0;i<fields.length;i++){  
	        System.out.println(fields[i].getName()+":"+fields[i].get(clazz.newInstance()));  
	    } 
          
        System.out.println("---↓---getDeclaredMethods---↓---");  
		Method[] declaredMethods=clazz.getDeclaredMethods();
		for(int i=0;i<declaredMethods.length;i++){  
	        System.out.println(declaredMethods[i].getName());  
	    } 
		System.out.println("---↓---getMethods---↓---");  
		Method[] methods=clazz.getMethods();
		for(int i=0;i<methods.length;i++){  
	        System.out.println(methods[i].getName());  
	    } 
		System.out.println("---↓---getConstructors---↓---");  
		Constructor[] constructor=clazz.getConstructors();
		for(int i=0;i<constructor.length;i++){  
	        System.out.println(constructor[i].toString());  
	    } 	
	}
}
輸出:

---↓---Value-Of-"CODE_0000"---↓---
錯誤碼0000
--↓--Use-Method-"getMessageMethod(String)"--↓--
this is getMessageMethod.and param is hello
--↓--Use-Method-"getMessageMethod(String,int)"--↓--
this is getMessageMethod.Param is hello,2
---↓---getDeclaredFields---↓---
CODE_0000:錯誤碼0000
CODE_0001:錯誤碼0001
CODE_0002:錯誤碼0002
CODE_0003:錯誤碼0003
---↓---getDeclaredMethods---↓---
getMessageMethod
getMessageMethod
---↓---getMethods---↓---
getMessageMethod
getMessageMethod
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
---↓---getConstructors---↓---
public test.Message(java.lang.String)
public test.Message()