反射
1.什么是反射
引用:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2.获取Class类对象的方式
- 在此我们以Person类为操作类进行说明
public class Person {
private int id;
public String name;
protected String addr;
double price;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(int id, String name, String addr, double price) {
super();
this.id = id;
this.name = name;
this.addr = addr;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
- 方法一:已知Person类
Class clazz = Person.class;
- 方法二:已知Person的类对象
Person person = new Person();
Class clazz1 = person.getClass();
- 方法三:已知Person类的包名+类名
Class clazz = Class.forName("str");//str为Person类的包名+类名
- 方法四:只对基本数据类型的封装类型有效
Class clazz = Integer.TYPE;
同一个类的Class类对象模板只有一个,所以以上所有的clazz对象都是引用的同一个内存地址.
3.通过反射如何获取Person类中的属性并赋值
- 通过反射获取Person类的属性
Class<Person> clazz = Person.class;
//获取属性对象集合
Field[] fields = clazz.getDeclaredFields();
//遍历属性对象集合
for(Field f : fields){
//获取访问修饰符
int modifiers = f.getModifiers();
//获取数据类型
String type = f.getType().getSimpleName();
//获取字段名
String name = f.getName();
System.out.println(modifiers+" "+ type+" "+name+";");
}
- 通过反射为属性赋值
Class<Person> clazz = Person.class;
//通过指定属性名获取属性字段
Field field = clazz.getDeclaredField("id");
//忽略访问修饰符,这样就可以private,protected修饰的字段赋值
field.setAccessible(true);
//实例化一个person对象
Person person = clazz.newInstance();
//为属性赋值
field.setInt(person, 20);
System.out.println(person.getId());
4.通过反射如何获取Person类的构造方法
Class<Person> clazz = Person.class;
//获取Person类中的构造方法的数组
Constructor<?>[] constructor = clazz.getDeclaredConstructors();
//遍历数组
for(Constructor c : constructor){
//获取构造方法访问修饰符
int modifiers = c.getModifiers();
//获取构造方法名
String nameString = c.getName();
//获取构造方法参数列表
Class[] parameters = c.getParameterTypes();
for(Class p : parameters){
//获取参数列表类型的简单名:即没有包名的数据类型
String para = p.getSimpleName();
System.out.println(modifiers+" "+nameString+" ("+para+")"+"{}");
}
}
上面所述只是对反射的一些浅显的介绍,反射常用于各种Java框架之中,用于简化开发人员的开发过程。反射中的方法还是挺多的,参阅Java帮助文档可以帮助我们更好的学习和理解Java反射的应用。
欢迎小伙伴们指正和交流