加載對(duì)應(yīng)類的字節(jié)碼文件潜必,獲取該類的Class類對(duì)象
Class cls = Class.forName("com.qfedu.a_reflect.Person");
獲取所有的公共的方法
Method[] allPublicMethods = cls.getMethods();
for (Method method : allPublicMethods) {
System.out.println(method);
}
//暴力反射
//能夠獲取Person里面的private方法纺腊, 并且能夠過濾掉從父類繼承而來的方法
Method[] allMethods = cls.getDeclaredMethods();
for (Method method : allMethods) {
System.out.println(method);
}
通過反射機(jī)制,執(zhí)行類中的成員方法
invoke(Object obj, Object... args);
Object obj 這是底層調(diào)用該方法的類對(duì)象
the object the underlying method is invoked from
Object... args 不定參數(shù)格带,是執(zhí)行該放的參數(shù)列表,是Object類型
args is arguments used for method call
//向利用反射,創(chuàng)建一個(gè)當(dāng)前類的對(duì)那個(gè)
Person p = (Person) cls.getConstructor(int.class, String.class).
newInstance(1, "狗蛋");
//獲取一個(gè)指定的方法谊迄,需要的參數(shù)是方法的名字字符串和參數(shù)列表惩琉,
Method aPublicMethod = cls.getMethod("sleep", int.class);
System.out.println("49" + aPublicMethod);
aPublicMethod.invoke(p, 15);
//獲取一個(gè)靜態(tài)方法
Method aPublicStaticMethod = cls.getMethod("eat", null);
aPublicStaticMethod.invoke(null, null);
//利用暴力反射獲取一個(gè)私有化的成員方法
Method aPrivateMethod = cls.getDeclaredMethod("testPrivate", null);
aPrivateMethod.setAccessible(true);
aPrivateMethod.invoke(p, null);