gpt4 book ai didi

java - Java中如何动态改变对象行为,动态代理没用

转载 作者:行者123 更新时间:2023-12-02 02:56:24 25 4
gpt4 key购买 nike

这是解释问题的代码片段:

public class Demo {
// I want to enhance this method.
public String a() {
return "A";
}

// this method is not enhanced but the internal a() invocation should be
public String b() {
return "-> " + a();
}
}

我想增强方法a(),当调用方法b()时,应该执行增强的a()。我猜想 CGLIB 代理不需要任何努力。

此外,这种增强操作应该是对象级别的而不是类级别的。

public static void verify() {
assert Objects.equals("-> A", new Demo().b());
assert !Objects.equals("-> A", enhance(new Demo()).b());
}

public static Demo enhance(Demo demo) {
throw new UnsupportedOperationException("I don't know how to do");
}

有办法解决这个问题吗?

顺便说一句:抱歉我的英语不好,但我认为我的意图已经描述得很清楚了。

补充:

实际上,我的问题是:

将记录异常堆栈跟踪,但其中一些异常堆栈跟踪通过使用 new XXException("sensitive") 在其 detailMessage 字段中包含敏感数据,或者某些IOException 将打印详细的绝对路径。

printStackTrace() 将调用 toString() 方法,toString() 方法将调用 getMessage() > 方法。 (可以查看JDK源码)

我想提供一个实用方法来包装/增强Exception,让printStackTrace()不打印敏感数据,而是打印堆栈跟踪以查找错误。然后这些Exception对象就可以安全地发送到log4j。

最佳答案

我不明白仅仅子类化有什么问题。

class EnhancedDemo extends Demo{
@Override
public String a(){
return "Enhanced A";
}
}

您仍然可以使用它来代替普通的演示:

public static void main(String... args) throws Exception {
Demo myDemo = new EnhancedDemo();
System.out.println(myDemo.b());
//output: -> Enhanced A
}

这还不够吗?您不能在您认为需要的地方重构代码以允许 dependency injection相反?

关于java - Java中如何动态改变对象行为,动态代理没用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com