加载对应类的字节码文件,获取该类的Class类对象
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);
}
通过反射机制,执行类中的成员方法
invoke(Object obj, Object... args);
Object obj 这是底层调用该方法的类对象
the object the underlying method is invoked from
Object... args 不定参数,是执行该放的参数列表,是Object类型
args is arguments used for method call
//向利用反射,创建一个当前类的对那个
Person p = (Person) cls.getConstructor(int.class, String.class).
newInstance(1, "狗蛋");
//获取一个指定的方法,需要的参数是方法的名字字符串和参数列表,
Method aPublicMethod = cls.getMethod("sleep", int.class);
System.out.println("49" + aPublicMethod);
aPublicMethod.invoke(p, 15);
//获取一个静态方法
Method aPublicStaticMethod = cls.getMethod("eat", null);
aPublicStaticMethod.invoke(null, null);
//利用暴力反射获取一个私有化的成员方法
Method aPrivateMethod = cls.getDeclaredMethod("testPrivate", null);
aPrivateMethod.setAccessible(true);
aPrivateMethod.invoke(p, null);