很多自动化的功能都是通过反射完成的,这对很多框架是非常重要的,因为很多框架就是做顶层抽象处理公用的逻辑,所以对于实现层的东西是不清楚的,有了反射机制,框架就可以在运行时获取到自己需要的实现层的一些信息
Java的的反射包java.lang.reflect中提供的最常用且重要的几个类就是Field、Method、Constructor这3个类了
Field提供如下几种方法:
Class.getDeclaredField(String name);
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括私有成员)。Class.getDeclaredFields();
返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的所有字段(包括私有成员)
我们先定义一个普通类
public class Person
{
public String name;
private Integer age;
private String sex;
...
}
在使用的时候
Person person =new Person();
//通过Class.getDeclaredField(String name)获取类或接口的指定已声明字段。
Field f1=person.getClass().getDeclaredField("name");
Field []f2=person.getClass().getDeclaredFields();
打印出结果为
-----Class.getDeclaredField(String name)用法-------
public java.lang.String com.xx.test.Person.name
-----Class.getDeclaredFields()用法-------
public java.lang.String com.xx.test.Person.name
private java.lang.Integer com.xx.test.Person.age
private java.lang.String com.xx.test.Person.sex
获取反射的三种方式
//方式一 :通过对象的getClass()方法
Class<?> clazz1 = str.getClass();
//方式二:通过类的class属性
Class<?> clazz2 = String.class;
//方式三:通过Class类的静态方法forName(String className)
Class<?> clazz3 = Class.forName("java.lang.String");
获取属性的属性值并修改属性值
获取属性的值用get(Object obj)的方法,但是获取私有属性的时候必须先设置Accessible为true,然后才能获取。
Person person =new Person();
Field f1=person.getClass().getDeclaredField("name");
System.out.println(f1.get(person));
对象序列化成json
在序列化的时候,先利用反射找到对象类的所有get方法,接下来去get,然后小写化,作为json的每个key值,而get方法的返回值作为value。接下来再反射field,添加到json中。