Fin*_*arr 3 java reflection aop
是否有可能在 Java 中“覆盖”超类的私有方法?
我希望覆盖其方法的类是第三方类,因此我无法修改源。如果有某种方法可以反射性地在类上设置方法,那将是理想的。
或者,如果可以拦截第三方类的私有方法,那么这将是合适的。
小智 6
是的。你可以用aspectj来做。这不是真正的覆盖,但结果会如此。
这里是你的超级班;
public class MySuperClass {
private void content(String text) {
System.out.print("I'm super " + text);
}
public void echo() {
content("!");
}
}
Run Code Online (Sandbox Code Playgroud)
创建一个包含类似方法的接口;
public interface Content {
void safeContent(String text);
}
Run Code Online (Sandbox Code Playgroud)
创建一个方面,强制超类实现该接口并添加一个环绕顾问来调用它。
public privileged aspect SuperClassAspect {
void around(MySuperClass obj)
: execution(* content(String)) && target(obj) {
Object[] args = thisJoinPoint.getArgs();
((Content) obj).safeContent((String) args[0]);
}
// compiler requires
public void MySuperClass.safeContent(String text) {}
declare parents :MySuperClass implements Content;
}
Run Code Online (Sandbox Code Playgroud)
创建扩展 super 并实现该接口的子类。
public class Overrider extends MySuperClass implements Content {
public void safeContent(String text) {
System.out.print("Not that super " + text);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您构造一个 Overrider 对象并调用 echo 方法,您将获得 Overriders safeContent 方法的输出。