Java中如何将字符串作为对象的方法调用?

3

我正在使用AOP来查找实例变量在设置之前和之后的值。因此,我拦截所有的setxxx方法,并尝试在之前和之后执行getxxx

//actual instance
Object target = joinPoint.getTarget();
//Type of the instance
Class objectClass = target.getClass();

我希望能够调用一个名为“getFirstName()”的字符串,实际上它是实例(目标)上的一个方法名称。我该如何做到这一点?
目前,我可以执行以下操作:
if (target instanceof User) {
    instanceVarCurrentValue = ((User) target).getFirstName();
}

但我无法检查项目中所有对象的实例,对于每个类,我都必须检查所有属性。

2
http://docs.oracle.com/javase/tutorial/reflect/ - JB Nizet
如果您要使用反射,我建议使用Apache的反射工具。那里有很多有用的方法,而且它不需要太多重复性的工作。 - Link19
3个回答

1
你需要使用反射。你必须在类上找到方法并调用它。
请参见下面的代码:
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    User user = new User();
    String name = runMethod(user, "getFirstName");
    System.out.println(name);
}

private static String runMethod(Object instance, String methodName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    Method method = instance.getClass().getMethod(methodName);
    return (String)method.invoke(instance);
}

0

在Java中解决这个问题的可能方法是编写覆盖所有情况的代码,其中包含大量的if和else以及instanceof表达式。

您需要实现类似于答案中的ObjectConverter,

或者您可以始终使用Java Reflection API。


1
你是说只有一种方法可以做到这一点,然后你又提供了另一种选择? - Marc-Andre
1
没问题,我只是觉得有点奇怪,想让你知道。如果听起来有攻击性或其他什么的话,对不起,那不是我的意图。 - Marc-Andre

0

对于这类问题,我通常使用一个方便的库jOOR——Java面向对象反射。它是Java反射工具的流畅包装器,可以让您编写如下代码:

String firstName = on(target).call("getFirstName").get();

有了上面的代码,任何一个拥有名为getFirstName方法的对象“target”都可以在这里使用,并且get()将(尝试)将结果转换为字符串。如果您知道您只需要处理一组特定类型,这些类型保证具有您感兴趣的方法,但不想编写和维护庞大的if-else块,那么这非常方便。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接