使用Java反射调用Getter和Setter
时间:2020-01-09 10:35:19 来源:igfitidea点击:
在本文中,我们将介绍如何在Java中使用反射来调用getter和setter。为了调用类的get()和set()方法,Java中有两种方法。
1.使用PropertyDescriptor类。
2.搜索该类的get和set方法并调用它。
使用PropertyDescriptor类
在PropertyDescriptor类中,有一些构造函数,我们可以在其中传递要为其创建描述符的属性,然后可以调用
- getReadMethod()–调用getter读取属性值。
- getWriteMethod()–调用设置器以写入属性值。
这是显示如何使用PropertyDescriptor类调用getter和setter的示例。这里有一个User类,其中包含三个字段,我们将使用PropertyDescriptor分别称为这些getter和setter。
public class User { private String name; private int age; boolean activeFlag; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isActiveFlag() { return activeFlag; } public void setActiveFlag(boolean activeFlag) { this.activeFlag = activeFlag; } }
主类具有调用User bean类的getter和setter的逻辑。
import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; public class GetterAndSetterDemo { public static void main(String[] args) { GetterAndSetterDemo gs = new GetterAndSetterDemo(); User user = new User(); gs.invokeSetter(user, "name", "Hercule"); gs.invokeSetter(user, "age", 67); gs.invokeSetter(user, "activeFlag", true); gs.invokeGetter(user, "name"); gs.invokeGetter(user, "age"); gs.invokeGetter(user, "activeFlag"); } private void invokeSetter(Object obj, String fieldName, Object value) { try { PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass()); // Call setter on specified property pd.getWriteMethod().invoke(obj, value); } catch (IntrospectionException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void invokeGetter(Object obj, String fieldName) { PropertyDescriptor pd; try { pd = new PropertyDescriptor(fieldName, obj.getClass()); // Call getter on specified property System.out.println(pd.getDisplayName()+"- " + pd.getReadMethod().invoke(obj)); } catch (IntrospectionException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
输出:
name- Hercule age- 67 activeFlag- true
搜索该类的get和set方法并调用它
调用getter和setter的另一种方法是获取类的所有方法的列表,然后从所有方法的列表中查找get和set方法并调用它们。
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class GetterAndSetterDemo { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { GetterAndSetterDemo gs = new GetterAndSetterDemo(); User user = new User(); // Get all the methods Method[] methods = user.getClass().getDeclaredMethods(); // search for setters // First invoke all the setters to set values for(Method method : methods){ if(isSetter(method)){ System.out.println("Method Name- " + method.getName()); if(method.getName().contains("Name")) { method.invoke(user, "Hercule"); } if(method.getName().contains("Age")) { method.invoke(user, 62); } if(method.getName().contains("ActiveFlag")) { method.invoke(user, true); } } } // search for getters for(Method method : methods){ if(isGetter(method)){ try { Object obj = method.invoke(user); System.out.println("Invoking "+ method.getName() + " Value returned is- " + obj); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } private static boolean isGetter(Method method){ // identify get methods if((method.getName().startsWith("get") || method.getName().startsWith("is")) && method.getParameterCount() == 0 && !method.getReturnType().equals(void.class)){ return true; } return false; } private static boolean isSetter(Method method){ // identify set methods if(method.getName().startsWith("set") && method.getParameterCount() == 1 && method.getReturnType().equals(void.class)){ return true; } return false; } }
输出:
Method Name- setName set name called Method Name- setActiveFlag Method Name- setAge Invoking getName Value returned is- Hercule Invoking getAge Value returned is- 62 Invoking isActiveFlag Value returned is- true