一、开场白
想必学java的小伙伴对反射都不陌生吧,反射在我们的开发中实用性很大,你用好了反射,你的代码整洁、代码性能、代码优化等都会大幅度的提高,所以不会用反射的小伙伴要多多学习了;下面我给大家说说反射的实用性。
二、概念以及作用
1. 概念:
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制;
2. 运用:
首先大家要明白一点,咱们写的代码是存储在后缀名是 .java的文件里的,但是它会被编译,最终真正去执行的是编译后的 .class文件。Java是面向对象的语言,一切皆对象,所以java认为 这些编译后的 class文件,这种事物也是一种对象,它也给抽象成了一种类,这个类就是Class,大家可以去AIP里看一下这个类;
https://tool.oschina.net/apidocs/apidoc?api=jdk-zh
<1> 通过反射创建对象
我们下面来举一个例子,下面这个例子就是创建了一个class对象
Class user= Class.forName("com.test.User");
但是我们想要new一个对象咋办?下面就来通过反射new一个无参对象;
User user= Class.forName("com.test.User").newInstance();
这样我们就把对象new好了,可以使用user中的方法了,但是我要构造有参的咋办,不要急下面我们来构造一个;
Class user= Class.forName("com.test.User");
Constructor c=clazz.getConstructor(String.class,int.class);//获取有参构造
User user=(User ) c.newInstance("sanmao",12); //通过有参构造创建对象
好了我们通过反射构造对象就到这了。
<2> 通过反射机制来获取属性的类型
我们下面来举一个例子,获取单个属性的返回值
Field field = User.class.getDeclaredField("name");
System.out.println(field.getName()); //获取属性name的
System.out.println(field.getType());//获取属性类型 class的
下面是获取所有属性的返回值
Field[] fields = User.class.getDeclaredFields();
System.out.println(field.getName()); //获取属性name的
System.out.println(field.getType());//获取属性类型 class的
还有其他返回值,大家可以打断点研究研究,我就写这两个值。
<3> 通过反射来set,get值
https://tool.oschina.net/apidocs/apidoc?api=jdk-zh
我们下面来举一个例子,获取单个属性并且set值
// 获取bean的某个属性的描述符
PropertyDescriptor propDesc = new PropertyDescriptor(name, User.class);
// 获得用于写入属性值的方法
Method methodSetName = propDesc.getWriteMethod();
// 写入属性值
methodSetName.invoke(user, "wong");
我们下面来举一个例子,获取单个属性并且get值
// 获取Bean的某个属性的描述符
PropertyDescriptor proDescriptor = new PropertyDescriptor(name, User.class);
// 获得用于读取属性值的方法
Method methodGetrName = proDescriptor.getReadMethod();
// 读取属性值
Object objName = methodGetName.invoke(user);
我们下面来举一个例子,获取所有属性并且set、get值
BeanInfo beanInfo = Introspector.getBeanInfo(user.getClass(), Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor p : propertyDescriptors) {
//获得属性名称
String name = p.getName();
Map<String, Object> map = new HashMap<>();
//调用该属性名称对应的getter方法
Object obj = new PropertyDescriptor(p.getName(), User.class).getReadMethod().invoke(user);
//调用该属性名称对应的setter方法
new PropertyDescriptor(p.getName(), User.class).getWriteMethod().invoke(user, obj);
}
上面所说的几个反射都是最常用的,大家如果遇到其他的问题,可以来联系我,请关注下面的公众号留言。