使用Java中的反射调用Getter和Setter
时间:2020-02-23 14:34:51 来源:igfitidea点击:
在本教程中,我们将看到如何使用Java中的反射调用getters和setter。
我们已经看到了如何使用Java中的反射来调用方法。
有两种方法可以使用Java中的反射来调用吸气器和Setter。
使用propertyDescriptor.
我们可以使用propertyDescriptor调用使用反射来调用getters和setter。
getter:调用propertyDescriptor Setter上的getReadMethod():propertydescriptor上的call getwriitemethod()。
让我们明白简单的例子。
我们将创建员工对象的对象,然后将调用Getter和Setter。
创建员工.java如下。
package org.igi.theitroad; public class Employee { String name; int age; public Employee() { } public Employee(String name, int age) { this.name=name; this.age=age; } 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; } }
创建InvokegettersetterMain以调用员工对象的Getter和Setter。
package org.igi.theitroad; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class InvokeGetterSetterMain { public static void main(String[] args) { InvokeGetterSetterMain igsm=new InvokeGetterSetterMain(); Employee emp1=new Employee(); igsm.invokeSetter(emp1, "name", "John"); igsm.invokeSetter(emp1, "age", 25); igsm.invokeGetter(emp1, "name"); igsm.invokeGetter(emp1, "age"); } public void invokeSetter(Object obj, String propertyName, Object variableValue) { PropertyDescriptor pd; try { pd = new PropertyDescriptor(propertyName, obj.getClass()); Method setter = pd.getWriteMethod(); try { setter.invoke(obj,variableValue); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } catch (IntrospectionException e) { e.printStackTrace(); } } public void invokeGetter(Object obj, String variableName) { try { PropertyDescriptor pd = new PropertyDescriptor(variableName, obj.getClass()); Method getter = pd.getReadMethod(); Object f = getter.invoke(obj); System.out.println(f); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | IntrospectionException e) { e.printStackTrace(); } } }
运行上面的程序时,我们将得到以下输出:
John 25
正如我们所看到的,我们能够使用反思调用Getters和Setter。
使用类的getdeclaredmethods
我们可以搜索任何属性的getter和setter并调用它。
这是一个同样的简单程序。
package org.igi.theitroad; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class InvokeGetterSetterWithMethodsMain { public static void main(String[] args) { InvokeGetterSetterWithMethodsMain igsm=new InvokeGetterSetterWithMethodsMain(); Employee emp1=new Employee(); Method methodName= igsm.getMethod("name",emp1.getClass(),"setter"); igsm.invokeSetter(emp1, "Martin",methodName); Method methodAge= igsm.getMethod("age",emp1.getClass(),"setter"); igsm.invokeSetter(emp1, 28,methodAge); Method methodNameGet= igsm.getMethod("name",emp1.getClass(),"getter"); igsm.invokeGetter(emp1,methodNameGet); Method methodAgeGet= igsm.getMethod("age",emp1.getClass(),"getter"); igsm.invokeGetter(emp1,methodAgeGet); } public Method getMethod(String variableName,Class aClass,String getterOrSetter) { Method[] declaredMethods = aClass.getDeclaredMethods(); for (Method method:declaredMethods) { if(getterOrSetter.equalsIgnoreCase("getter")) { if(isGetter(method) && method.getName().toUpperCase().contains(variableName.toUpperCase())) { return method; } } if(getterOrSetter.equalsIgnoreCase("setter")) { if(isSetter(method) && method.getName().toUpperCase().contains(variableName.toUpperCase())) { return method; } } } return null; } private static boolean isGetter(Method method){ //check for getter 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){ //check for setter methods if(method.getName().startsWith("set") && method.getParameterCount() == 1 && method.getReturnType().equals(void.class)){ return true; } return false; } public void invokeSetter(Object obj,Object variableValue,Method setter) { try { setter.invoke(obj,variableValue); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } public void invokeGetter(Object obj,Method getter) { try { Object f = getter.invoke(obj); System.out.println(f); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } }
运行上面的程序时,我们将得到以下输出:
Martin 28