【加载】指定类的字节码文件,获取对应的Class对象
1. 让JVM根据类名,加载Person.java对应的字节码文件Person.class 到内存的代码区
2. 把加载到内存代码区Person.class 字节码文件生成一个Class类对象返回
Class cls = Class.forName("com.qfedu.a_reflect.Person");
获取构造方法
//Constructor 这是构造方法的类
//可以通过Class获取所有的【非私有化构造方法】,方法是Constructor[] getConstuctors();
Constructor[] constructors = cls.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
通过暴力反射获取私有化构造方法
//暴力反射
Constructor[] allConstructors = cls.getDeclaredConstructors();
for (Constructor constructor : allConstructors) {
System.out.println(constructor);
}
根据参数获取具体的构造方法
getConstructor(Class... parameterTypes);
不定参数列表,表示参数的类型要求是Class类型,但是数量不限制
在确定数据类型的情况下,可以直接通过数据类型.class获取对应Class数据类型
例如:int.class String.class
Constructor aConstructor = cls.getConstructor(int.class, String.class);
System.out.println(aConstructor);
利用Constructor对象创建一个Person类对象
newInstance(Object... initargs)
也是一个不定参的方法,需要的参数都是Object类型的,参数个数不确定
*/
Person p = (Person) aConstructor.newInstance(1, "海洋");
System.out.println(p.getId() + ":" + p.getName());
p.sleep(5);
p.game();
p.eat(); //任何通过反射机制,调用static修饰的成员方法,并且不报警告
通过暴力反射,借助于指定的参数,获取private修饰的无参构造方法
Constructor privateConstructor = cls.getDeclaredConstructor(null);
System.out.println(privateConstructor);
//setAccessible(boolean ) 给予操作Private修饰方法的权限
privateConstructor.setAccessible(true);
Person p2 = (Person) privateConstructor.newInstance(null);
p2.setId(2);
p2.setName("刘德华");
System.out.println(p2);