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);
}
}