反射-通過反射獲取無參無返回值成員方法、帶參帶返回值成員方法並使用

ZHOU_VIP發表於2017-06-11

package cn.itcast_04;

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

public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		// 獲取位元組碼檔案物件
		Class c = Class.forName("cn.itcast_01.Person");

		// 獲取所有的方法
		// Method[] methods = c.getMethods(); // 獲取自己的包括父親的公共方法
		// Method[] methods = c.getDeclaredMethods(); // 獲取自己的所有的方法
		// for (Method method : methods) {
		// System.out.println(method);
		// }

		Constructor con = c.getConstructor();
		Object obj = con.newInstance();


		// 獲取單個方法並使用
		// public void show()
		// public Method getMethod(String name,Class<?>... parameterTypes)
		// 第一個參數列示的方法名,第二個參數列示的是方法的引數的class型別
		Method m1 = c.getMethod("show");
		// public Object invoke(Object obj,Object... args)
		// 返回值是Object接收,第一個參數列示物件是誰,第二參數列示呼叫該方法的實際引數
		m1.invoke(obj); // 呼叫obj物件的m1方法


		// public void method(String s)
		Method m2 = c.getMethod("method", String.class);
		m2.invoke(obj, "hello");


		// public String getString(String s, int i)
		Method m3 = c.getMethod("getString", String.class, int.class);
		// 任何型別都可以用Object接收
		Object objString = m3.invoke(obj, "hello", 100);
		System.out.println(objString);
		
		// String s = (String)m3.invoke(obj, "hello",100);你明確知道是什麼型別,可以強轉回來
		// System.out.println(s);

		// private void function()
		Method m4 = c.getDeclaredMethod("function");
		m4.setAccessible(true);
		m4.invoke(obj);
	}
}



相關文章