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
}