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();
}

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

4

3 回答 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);
}
于 2013-08-21T12:50:22.460 回答
0

我对这类事情的首选解决方案是一个名为jOOR的方便库- 用于“Java 面向对象的反射”。它是围绕 Java 反射工具的流畅包装器,可让您编写如下代码:

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

有了上述内容,任何带有调用方法的对象“目标”getFirstName都将在这里工作,并且get()将(尝试)将结果转换为字符串。如果您知道您只需要处理一组特定的类型,这些类型保证具有您感兴趣的方法,但又不想编写和维护一个巨大的 if-else 块,那将非常方便。

于 2013-08-21T13:07:16.373 回答
0

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

您将需要在此答案中实现 ObjectConverter 之类的东西,

或者,您始终可以使用 Java 反射 API。

于 2013-08-21T12:47:37.620 回答