反射(构造方法)

【加载】指定类的字节码文件,获取对应的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);

你可能感兴趣的:(反射(构造方法))