Java如何通过反射获取对象的属性和值
Java反射获取对象的属性和值
最近有一个功能,需要判断传过来的对象的属性值是否为空,并附带其他一些判断操作。
一开始想着直接obj.getXXX()
取出来再挨个判断,后来觉得写了太多重复代码了,于是想着用Java反射试一试。
现在在这里记录一下, 换了一个例子,获取Person
对象的属性名和属性值。
代码:
Person对象:
public class Person { private String firstName; private String lastName; public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } }
获取属性和值的方法:
public static void main(String[] args) { Person p1 = new Person("xiao ming", "huang"); getField(p1); } public static void getField(Object obj) { Class<?> clazz = obj.getClass(); Field[] field = clazz.getDeclaredFields(); for (Field f : field) { f.setAccessible(true); try { System.out.println("属性名:" + f.getName()+",属性值:" + f.get(obj).toString()); // ... } catch (IllegalAccessException e) { e.printStackTrace(); } } }
结果:
属性名:firstName,属性值:xiao ming
属性名:lastName,属性值:huang
Java反射的三种方式,获取 属性、方法、构造方法 简单明了
反射的步骤如下:
1.获取想要操作的类的Class对象,该Class对象才是类的核心,通过它可以调用类的任意方法。
2.调用Class对象所对应的类中定义的方法,这是反射的使用阶段。
3.使用反射API来获取并调用类的属性和方法等信息
java的反射有三种方式实现
1.调用某个对象的getClass方法以获取该类的Class对象:
Person p = new Person(); Class clazz = p.getClass();
2.调用某个类的Class属性以获取该类对应的Class对象:
Class clazz = Person.class;
3.调用Class类中的forName静态方法获取该类对象,这是最安全也是性能最好的方法:
Class clazz = Class.forNmae("com.user.entery.Person")//类的全路径包括包名
获取类的内容
1.获取全部方法
```Class three = Class.forName("com.nasi.demo.entity.User"); //获取全部方法 Method[] declaredMethods = three.getDeclaredMethods();
2.获取全部构造方法
Class three = Class.forName("com.nasi.demo.entity.User"); //获取全部构造方法 Constructor[] declaredConstructors = three.getDeclaredConstructors();
3.获取全部属性
Class three = Class.forName("com.nasi.demo.entity.User"); Field[] declaredFields = two.getDeclaredFields();
方法调用
1、编写一个 Java 类
public class Calculator{ public double add(double score1,double score2){ return score1 + score2; } public void print(){ System.out.println("OK"); } public static double mul(double score1,double score2){ return score1 * score2; } }
2、通过 反射 调用类里面的方法
public class CalculatorTest { public static void main(String[] args) throws Exception { //通过类的.class属性获取 Class<Calculator> clz = Calculator.class; //或者通过类的完整路径获取,这个方法由于不能确定传入的路径是否正确,这个方法会抛ClassNotFoundException // Class<Calculator> clz = Class.forName("test.Calculator"); //或者new一个实例,然后通过实例的getClass()方法获取 // Calculator s = new Calculator(); // Class<Calculator> clz = s.getClass(); //1. 获取类中带有方法签名的mul方法,getMethod第一个参数为方法名,第二个参数为mul的参数类型数组 Method method = clz.getMethod("mul", new Class[]{double.class,double.class}); //invoke 方法的第一个参数是被调用的对象,这里是静态方法故为null,第二个参数为给将被调用的方法传入的参数 Object result = method.invoke(null, new Object[]{2.0,2.5}); //如果方法mul是私有的private方法,按照上面的方法去调用则会产生异常NoSuchMethodException,这时必须改变其访问属性 //method.setAccessible(true);//私有的方法通过发射可以修改其访问权限 System.out.println(result);//结果为5.0 //2. 获取类中的非静态方法 Method method_2 = clz.getMethod("add", new Class[]{double.class,double.class}); //这是实例方法必须在一个对象上执行 Object result_2 = method_2.invoke(new Calculator(), new Object[]{2.0,2.5}); System.out.println(result_2);//4.5 //3. 获取没有方法签名的方法print Method method_3 = clz.getMethod("print", new Class[]{}); Object result_3 = method_3.invoke(new Calculator(), null);//result_3为null,该方法不返回结果 } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot项目打包成war包并部署在tomcat上运行的操作步骤
我们开发 SpringBoot 项目有时我们会需要打包成 war 包,放入外置的 Tomcat 中进行运行,或者使用工具idea直接启动,便于开发调试,本文给大家分享SpringBoot项目打包成war包并部署在tomcat上运行的操作步骤,感兴趣的朋友一起看看吧2024-03-03SpringBoot源码分析之bootstrap.properties文件加载的原理
本文通过访问看到bootstrap.properties中的信息获取到了,同时age也被application.properties中的属性覆盖掉了。加载顺序到底是什么?为什么会覆盖呢?我们接下来分析下吧2021-12-12
最新评论