Java Reflect/AOP 覆盖超类型私有方法

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 方法的输出。