当前位置: 首页 > 后端技术 > Java

面试官:私有方法可以代理吗?不要误会,.

时间:2023-04-02 01:37:27 Java

JDK动态代理:抽象类不能代理没有接口不能代理Java8之前,接口可以有常量变量和抽象方法。我们不能在接口中提供方法实现。如果我们想提供抽象和非抽象方法的组合(方法和实现),那么我们必须使用抽象类。在Java8接口中引入了一些新特性——默认方法和静态方法。Java9不仅像Java8一样支持接口默认方法,还支持私有方法。jdk1.9接口可以有static,default,private方法,私有静态方法,都必须有方法体。接口的静态方法可以改写还是实现?不能被重写,不能被代理静态方法属于类,而不是对象。一个类是没有办法重写或实现的,当然不能在它的实现类中重写或实现。proxy中不会有这个方法,userProxyNone,别说被代理了,defaultMethod也不可能被代理吧?可以覆盖(非强制),也可以代理privateMethod可以代理吗?它不能被重写,也不能被代理。它只能在接口本身内部调用。没有人有权访问它。当然不能被代理,所以动态代理中不会有这个私有方法。当然,要证明这一点,可以使用接口的public方法。间接调用看看有没有被代理,只有static、default、private方法可以在接口中有方法体,static是不允许的(static不能调用非static方法),没办法只能用默认测试发现private没有被proxy保护,下面的package方法是否可以被代理?接口里不允许有这些修饰符,接口里没有,代理在哪?总结综上所述,只能代理public和default方法,不允许private和static,public可以重写可以代理(实现类中必须覆盖)private和static不能被覆盖,也不能被代理默认代理)publicinterfaceMapperInterface{staticvoidstaticMethod(){System.out.println("staticbb");}默认voiddefaultMethod(){privateMethod();}privatestaticvoidprivateMethod(){System.out.println("MapperInterfaceprivatete");}voidpublicMethod();}publicclassDynamicProxy{publicstaticTgetProxy(Tt){return(T)Proxy.newProxyInstance(t.getClass().getClassLoader(),t.getClass().getInterfaces(),newInvocationHandler(){@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{//调用目标方法前的通用逻辑System.out.println("establishconnection");//调用目标方法,这句话必须包含的是调用传入对象的方法(核心代码写在里面)Objectobject=method.invoke(t,args);//调用后目标方法公共逻辑做System.out.println("committransaction");System.out.println("closeconnection");returnobject;}});}}publicclassUserimplementsMapperInterface{@OverridepublicvoidpublicMethod(){System.out.println("userpublic");}//可以覆盖但不是强制的,无论是否覆盖都可以代理//@Override//publicvoiddefaultMethod(){//System.out.println("userdefault");//}}publicclassTest{publicstaticvoidmain(String[]args){Useruser=newUser();MapperInterfaceuserProxy=DynamicProxy.getProxy(user);userProxy.defaultMethod();}}来源:blog.csdn.net/weixin_39143647/article/details/118485683推荐近期文章:1.1,000+Java面试题及答案(2022最新版)2.精彩!Java协程来了。.3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!