我正在使用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();
}
但是我无法检查项目中所有对象的实例以及每个类我必须检查所有属性
答案 0 :(得分:1)
您需要使用Reflection。你必须在课堂上找到方法并调用它 请参阅以下代码:
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);
}
答案 1 :(得分:0)
在Java中解决这个问题的可能方法是编写涵盖所有包含if和else和instanceof表达式的情况的代码。
您需要实现ObjectConverter之类的内容,如此answer,
或者您始终可以使用Java Reflection API。
答案 2 :(得分:0)
我这样的解决方案是一个方便的库,名为jOOR - 用于“Java面向对象的反射”。它是Java反射工具的流畅包装器,可以让你编写如下代码:
String firstName = on(target).call("getFirstName").get();
通过上述内容,任何名为getFirstName
的方法的'target'对象都可以在这里工作,而get()
将(尝试)将结果转换为字符串。非常方便,如果你知道你只需处理一组特定的类型,这些类型保证有你感兴趣的方法,但不想编写和维护一个巨大的if-else块。