反射就是剖析类对象,动态获取类信息 类内容 类组成的能力
获取类信息的三种方式
class.forname()
对象.getClass()
类名.class
以下是代码实现
package com.qcby.c_reflection;
public class DemoTest {
public static void main(String[] args) throws ClassNotFoundException {
//1 对象.getClass()
Person person = new Person();
Class<? extends Person> aClass = person.getClass();
System.out.println("aClass = " + aClass);
System.out.println("===============");
//2 类。class
Class<Person> personClass = Person.class;
System.out.println("personClass = " + personClass);
//3Class.forName
Class<?> aClass1 = Class.forName("com.qcby.c_reflection.Person");
System.out.println("aClass1 = " + aClass1);
}
}
反射构造方法&暴力反射
反射所有的public构造方法
代码实现
package com.qcby.c_reflection;
import java.lang.reflect.Constructor;
public class DemoTest2 {
public static void main(String[] args) {
Class<Person> personClass = Person.class;
//获取所有public的构造
Constructor<?>[] constructors = personClass.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
}
}
获取空参的构造方法
代码实现
package com.qcby.c_reflection;
import java.lang.reflect.Constructor;
public class DemoTest3 {
public static void main(String[] args) throws Exception{
Class<Person> personClass = Person.class;
Constructor<Person> constructor = personClass.getConstructor();
System.out.println("constructor = " + constructor);
/**
* 好比是 Person = new Perosn()
*/
Person person = constructor.newInstance();
System.out.println("person = " + person);
}
}
获取所有构造函数,包括private
代码实现
package com.qcby.c_reflection;
import java.lang.reflect.Constructor;
public class DemoTest4 {
public static void main(String[] args) {
Class<Person> personClass = Person.class;
Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println("declaredConstructors = " + declaredConstructor);
}
}
}
获取private以及更改修改权限
constructor.setAccessible(true); 为true 表示可以更改private
package com.qcby.c_reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class DemoTest5 {
public static void main(String[] args) throws Exception {
Class<Person> personClass = Person.class;
Constructor<Person> constructor = personClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Person person = constructor.newInstance("山上");
System.out.println(person);
}
}