一.什么是反射。
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
二.实现
我们就创建一个User类
public class User{
private String username;
private Integer age;
private Integer gender;
//添加几个get,set方法。
}
public User(){} //无参构造
//有参构造
public User(String name, Integer age , Integer gender){
setAge(age);
setGender(gender);
setName(name);
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
TestData类
package com.seecen.reflect.pack;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestData {
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
User user = new User("关羽", 22, 1);
printJson(user);
constructor(user);
}
public static void printJson(Object obj) throws InvocationTargetException, IllegalAccessException {
Class<?> clazz = obj.getClass();
Method[] methods = clazz.getMethods();//得到类方法
Field[] fields = clazz.getDeclaredFields();//得到类属性
//反射
for (Method method : methods) {
if (method.getName().startsWith("get")) {
Object object = method.invoke(obj);//调用该方法()参数为该类对象,即调用谁的方法。
System.out.println("{\"" + method.getName() + "\":\"" + object + "\"}");
}
}
for (Field field : fields) {
field.setAccessible(true);//因为属性为私有属性,这句话是为了给访问权限,否则会报错。
Object value = field.get(obj);
System.out.println("{\"" + field.getName() + "\":\"" + value + "\"}");
}
}
public static void constructor(Object obj) throws NoSuchMethodException {
Class<?> clazz=obj.getClass();
//获取该类所有构造函数
Constructor<?>[] constructors=clazz.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
//两种方法获取该构造的参数个数
System.out.print(constructor.getParameters().length+"\t");
System.out.print(constructor.getParameterCount()+"\t");
}
}
}
System.out.println(constructor.getParameterCount());
}
}
}
三、控制台输出
初步的JSON格式就做好了。