Java反射使用实例
——Javee
Java反射机制是指,在Java运行的过程中可以获取到任意一个类的属性和方法;也可以获取任意一个对象的属性或执行对象的方法。
反射方法的简介:
package cn.edu.ncu.online.work2;
import cn.edu.ncu.online.work1.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Author Javee
* @Date 2019/8/15 11:05
* @Description
*/
public class Test {
public static void main(String[] args) {
String classPath = "cn.edu.ncu.online.work1.Student";
Student student = new Student("Javee", 20);
printProperty(classPath);
}
/*
*一般情况下,含有Declared的方法获取到的属性为不含父类属性
* 反之,获取到的属性含有父类属性
*/
public static void printProperty(String classPath){
try {
//解析传进来的类的路径名,通过路径获取类
Class<?> clazz = Class.forName(classPath);
//return clazz.newInstance(); //使用反射创建对象
//获取这个字节码所有的public字段(含父类)
Field[] fields = clazz.getFields();
//获取当前类的所有字段
Field[] myFilds = clazz.getDeclaredFields();
//获取所有public方法(含父类)
Method[] myMethods = clazz.getMethods();
//动态获取当前类的类名
System.out.println(clazz.getName());
//获取当前类的public构造方法
Constructor<?>[] constructors = clazz.getConstructors();
System.out.println(constructors.length);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
通过反射将类的属性以Json的格式打印到控制台:
//People.java
package cn.edu.ncu.online.work1;
/**
* @Author Javee
* @Date 2019/8/15 11:06
* @Description
*/
public class People {
public People(){}
private double height;
private int gender;
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
}
//Student.java
package cn.edu.ncu.online.work1;
/**
* @Author Javee
* @Date 2019/8/15 10:17
* @Description
*/
public class Student extends People{
private String name;
private int age;
private Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
//ObjectToJson.java
package cn.edu.ncu.online.work2;
import cn.edu.ncu.online.work1.Student;
import java.lang.reflect.Method;
/**
* @Author Javee
* @Date 2019/8/15 14:37
* @Description
*/
public class ObjectToJson {
public static void main(String[] args) throws Exception {
Student student = new Student("Javee", 18);
student.setGender(1);
student.setHeight(181);
String json = getJson(student);
System.out.println(json);
}
private static String getJson(Object obj) throws Exception{
StringBuilder jsonStr = new StringBuilder("{");
//解析传过来的对象,通过对象获取类
Class<?> clazz = obj.getClass();
//获取所有方法
Method[] methods = clazz.getMethods();
for(Method method : methods){
if(method.getName().startsWith("get")){
//获取属性名
String jsonKey = method.getName().substring(3).toLowerCase();
//如果是Object类中的getClass方法,则跳过
if(jsonKey.equals("class")) continue;
//method.invoke(obj) 表示运行obj对象中的method方法
String jsonValue = method.invoke(obj).toString();
jsonStr.append("\"" + jsonKey + "\"");
jsonStr.append(":");
jsonStr.append("\"" + jsonValue + "\"");
jsonStr.append(",");
}
}
jsonStr.deleteCharAt(jsonStr.length() - 1); //删除添加的最后一个逗号
jsonStr.append("}");
return jsonStr.toString();
}
}
运行结果:{"name":"Javee","age":"18","height":"181.0","gender":"1"}