JDK动静代理中:抽象类不能够被代理 没有接口不能够被代理

  • 在 Java 8之前,接口能够有常量变量和形象办法。咱们不能在接口中提供办法实现。如果咱们要提供形象办法和非形象办法(办法与实现)的组合,那么咱们就得应用抽象类。
  • 在 Java 8 接口引入了一些新性能——默认办法和静态方法。
  • Java 9 不仅像 Java 8 一样反对接口默认办法,同时还反对公有办法
  • jdk1.9接口中能够有static、default、private办法、private static办法 同时他们都必须有办法体

接口的静态方法能被重写或实现吗?

不可被重写 不可被代理

静态方法是属于类的,不属于对象,类哪有重写或实现,所以在其实现类里当然不能重写或实现 在代理中也不会有此办法,userProxy外面都没有,更别说被代理了,那是不可能的

defaultMethod能够被代理吗?

能够被重写(不强制),也能够被代理

privateMethod能够被代理吗?

不可被重写 不可被代理

只能在接口本人外部调用,,都没有权限拜访它当然不能被代理了,所以动静代理中基本不会有这个公有办法

当然为了证实这一点能够 应用接口的公共办法来间接调用它,看它到底有没有被代理, 而接口中能够有办法体的只有static、default、private办法,而static又不能够(static不能够调用非static办法),别无选择,只能用default测了 发现private并没有被代理

protected 、package上面办法能够被代理吗?

这些修饰符在接口中都是不容许的,接口中都没有,哪来的代理啊

总结

综上所述只有public和default办法能够被代理,private和static都不能够

  • public可重写可被代理(在实现类中重写是强制的)
  • private和static不能够被重写也不能够被代理
  • default可重写可代理(在实现类中不强制必须重写,不过不论重写不重写都会主动被代理)
public interface MapperInterface {    static void staticMethod() {        System.out.println("static bb");    }     default void defaultMethod() {        privateMethod();    }     private static void privateMethod() {        System.out.println("MapperInterface private");    }     void publicMethod();}public class DynamicProxy {     public static <T> T getProxy(T t) {        return (T) Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), new InvocationHandler() {            @Override            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                 //调用指标办法之前做的公共逻辑                System.out.println("建设连贯");                //调用指标办法,这句话必须要有的,就是调用被传入的对象的办法(外面写了外围代码)                Object object = method.invoke(t, args);                //调用指标办法之后做的公共逻辑                System.out.println("提交事务");                System.out.println("敞开连贯");                return object;            }        });    }}public class User implements MapperInterface {      @Override    public void publicMethod() {        System.out.println("user public");    } // 能够被重写 不强制,不论有没有重写 都能够被代理//    @Override//    public void defaultMethod() {//        System.out.println("user default");//    }}public class Test {    public static void main(String[] args) {        User user = new User();        MapperInterface userProxy = DynamicProxy.getProxy(user);        userProxy.defaultMethod();    }}

起源:blog.csdn.net/weixin_39143647/article/details/118485683

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!