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

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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理