Java Reflect/AOP 重写超类型私有方法

2023-12-19

Java 中是否有可能“重写”超类的私有方法?

我希望重写其方法的类是第三方类,因此我无法修改源代码。如果有某种方法可以反射性地在类上设置方法,那就太理想了。

或者,如果可以拦截第三方类的私有方法,那么这将是合适的。


YES。你可以这样做AspectJ https://www.eclipse.org/aspectj/。这不是真正的覆盖,但结果将是这样。

这是你的超级班级;

public class MySuperClass {

    private void content(String text) {
       System.out.print("I'm super " + text);
    }
    
    public void echo() {
       content("!");
    }        
}

创建一个包含类似方法的接口;

public interface Content {
    void safeContent(String text);
}

创建一个方面,强制超类实现该接口并添加一个周围顾问来调用它。

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

创建扩展 super 并实现该接口的子类。

public class Overrider extends MySuperClass implements Content {

    public void safeContent(String text) {
        System.out.print("Not that super " + text);
    }
}

现在,如果您构造一个 Overrider 对象并调用 echo 方法,您将获得 Overriders safeContent 方法的输出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Reflect/AOP 重写超类型私有方法 的相关文章

随机推荐