Java:常用反射获取类信息()

1、反射获取构造方法

Constructor getConstructor(Class… parameterTypes):返回单个公共构造方法

Constructor getDeclaredConstructor(Class… parameterTypes):返回单个声明的构造方法

Constructor<?>[] getConstructors():返回所有公共构造方法,包好父类公共构造方法

Constructor<?>[] getDeclaredConstructors():返回指定类所有声明的构造方法,包含 private 等,不包含父类任何方法。

Class<?> clazz = Class.forName("com.casoli.test.Test");
// 获取有参构造方法
Constructor<?> con = clazz.getConstructor(String.class, Integer.class, String.class);
// 抑制访问检查(使其可以访问private声明的对象。否则对于非public,会报错)
con.setAccessible(true);
Object obj = con.newInstance("test", 1, "test");

2、反射获取方法

Method getMethod(String methodName, Class<?>… inputClassTypes) : 返回单个指定名称参数的公共方法

Method getDeclaredMethod(String methodName, Class<?>… inputClassTypes) : 返回单个指定名称参数的声明方法

Method[] getMethods() : 返回多个指定名称参数的公共方法

Method[] getDeclaredMethods() :返回多个指定名称参数的声明方法

String str = "123 456";
// 第一个参数是方法名,第二个是入参类型
Method method = str.getClass().getMethod("split", String.class);
// public 可以不设置此项
// method.setAccessible(true);
// invoke 调用,第一个参数是实例对象,第二个是入参的实际值。如果是 static,实例对象为null。
String[] strs = (String[]) method.invoke(str, " ");
for (String s : strs) {
    System.out.println(s);
}

3、反射获取属性

Field getField(String fieldName) : 获取类的指定 public 属性

Field getDeclaredField(String fieldName) : 获取类的某个属性

Field[] getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。

Field[] getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。

// 属性如果不是 static 需要实例化才能取到
ObjectX obj = new ObjectX();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
    field.setAccessible(true);
    // 从obj对象中获取该字段对应的值,如果当前字段是static,那么这里的queryVO是""|| null 都能查出来
    Object value = field.get(obj); 
    System.out.println("属性名" + field.getName() + ",值:" + field.get(obj) + ",类型: " + field.getType().toString());
    // 修改值
    field.set(obj, "xxx");
}

4、反射获取注解

Annotation getAnnotation(Class<?> annotationClazz) : 获取指定注解

boolean isAnnotationPresent(Class<?> annotationClazz) :判断是否存在该注解(存在:true)

Field field = obj.getClass().getField("xxx");
if(field.isAnnotationPresent(Xxx.class)) {
    // TODO
}
————————

1、反射获取构造方法

Constructor getConstructor(Class… parameterTypes):返回单个公共构造方法

Constructor getDeclaredConstructor(Class… parameterTypes):返回单个声明的构造方法

Constructor<?>[] getConstructors():返回所有公共构造方法,包好父类公共构造方法

Constructor<?>[] getDeclaredConstructors():返回指定类所有声明的构造方法,包含 private 等,不包含父类任何方法。

Class<?> clazz = Class.forName("com.casoli.test.Test");
// 获取有参构造方法
Constructor<?> con = clazz.getConstructor(String.class, Integer.class, String.class);
// 抑制访问检查(使其可以访问private声明的对象。否则对于非public,会报错)
con.setAccessible(true);
Object obj = con.newInstance("test", 1, "test");

2、反射获取方法

Method getMethod(String methodName, Class<?>… inputClassTypes) : 返回单个指定名称参数的公共方法

Method getDeclaredMethod(String methodName, Class<?>… inputClassTypes) : 返回单个指定名称参数的声明方法

Method[] getMethods() : 返回多个指定名称参数的公共方法

Method[] getDeclaredMethods() :返回多个指定名称参数的声明方法

String str = "123 456";
// 第一个参数是方法名,第二个是入参类型
Method method = str.getClass().getMethod("split", String.class);
// public 可以不设置此项
// method.setAccessible(true);
// invoke 调用,第一个参数是实例对象,第二个是入参的实际值。如果是 static,实例对象为null。
String[] strs = (String[]) method.invoke(str, " ");
for (String s : strs) {
    System.out.println(s);
}

3、反射获取属性

Field getField(String fieldName) : 获取类的指定 public 属性

Field getDeclaredField(String fieldName) : 获取类的某个属性

Field[] getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。

Field[] getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。

// 属性如果不是 static 需要实例化才能取到
ObjectX obj = new ObjectX();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
    field.setAccessible(true);
    // 从obj对象中获取该字段对应的值,如果当前字段是static,那么这里的queryVO是""|| null 都能查出来
    Object value = field.get(obj); 
    System.out.println("属性名" + field.getName() + ",值:" + field.get(obj) + ",类型: " + field.getType().toString());
    // 修改值
    field.set(obj, "xxx");
}

4、反射获取注解

Annotation getAnnotation(Class<?> annotationClazz) : 获取指定注解

boolean isAnnotationPresent(Class<?> annotationClazz) :判断是否存在该注解(存在:true)

Field field = obj.getClass().getField("xxx");
if(field.isAnnotationPresent(Xxx.class)) {
    // TODO
}