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 }

__EOF__

本文作者钢板
本文链接https://www.cnblogs.com/casoli/p/16555411.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   钢板意志  阅读(756)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示