首页 > 基础资料 博客日记

Java:常用反射获取类信息

2023-08-09 19:26:10基础资料围观187

本篇文章分享Java:常用反射获取类信息,对你有帮助的话记得收藏一下,看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
}

文章来源:https://www.cnblogs.com/casoli/p/16555411.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云