使用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

