关于java:面试官private-方法可以被代理吗别答错了

6次阅读

共计 2061 个字符,预计需要花费 6 分钟才能阅读完成。

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 开发手册(嵩山版)》最新公布,速速下载!

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

正文完
 0