反射机制简析
1.java反射机制功能
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理。
2.获取源头Class
所有类的对象其实都是Class的实例。
2.1. 获取Class对象的三种方式
第一种方式: 对象.class
// 1、通过对象获取Class对象
public static void testGetClassByObj(){
//需要有一个对象
Person p=new Person();
Class aClass = p.getClass();
System.out.println(aClass);
}
第二种方式: 类.class
// 2、通过类名获取Class对象
public static void testGetClassByClass(){
Class clz= Person.class;
System.out.println(clz);
}
第三种方式(推荐方式): Class.forName()
// 3、通过字符串获取类的Class对象
public static void testGetClassByString(){
//完整的包名+类名
String className="com.shsxt.test.reflect.Person";
try {
Class aClass = Class.forName(className);
System.out.println(aClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
2.2. 获取修饰符
使用 getModifiers() 即可, Modifier 类提供了 static 方法和
常量来解码类和成员访问修饰符
//获取Person的Class
Class personClass = Person.class;
//获取修饰符,以整数编码
int m1=personClass.getModifiers();
//打印编码值
System.out.println(m1);
//使用Modifier转换为相应的字符串
System.out.println(Modifier.toString(m1));
//获取Class的类型
System.out.println(personClass.getSimpleName());
3. 创建对象
3.1根据Class对象,我们可以获得构造器,为实例化对象做准备。
主要通过以下类和方法
Constructor getConstructor() 返回一个Constructor对象
Constructor [ ] getConstructors() 返回一个Constructor数组对象
3.2. 实例化对象(重点)
创建对象的方式,有new 、克隆、反序列化,再加一种,根据Class对象,使用newInstance() 或者构造器实例化对象。
import java.lang.reflect.Constructor;
// 通过反射
// clz newInstance()
// 通过获取构造器, 利用构造器去创建对象
public class Demo004NewInstance {
public static void main(String[] args) throws Exception {
//1.获取Class
Class<Person> aClass =(Class<Person>) Class.forName("com.shsxt.test.reflect.Person");
//2.创建对象,必须保证空构造的存在,而且只能是调用空构造,属性是没有数据的
Person p= aClass.newInstance();
System.out.println(p);
//获取指定构造器 获取空构造
//获取所有的public 权限的构造器
Constructor<Person> constructor = aClass.getConstructor();
// 执行构造器,获取对应Bean对象
Person person = constructor.newInstance();
System.out.println(person);
// 获取指定构造器 获取带参构造 String类型, int类型
Constructor<Person> constructor1 = aClass.getConstructor(String.class,int.class);
//执行构造器
Person amy = constructor1.newInstance("Amy", 18);
System.out.println(amy);
}
}
注意:newInstance()是调用空构造,如果空构造不存在,会出现异常。由此可知,使用其他构造器创建对象比较麻烦,使用空构造非常简单。确保空构造存在。