淺談Java中的private方法是否可以被代理
JDK動態(tài)代理中:抽象類不可以被代理 沒有接口不可以被代理
- 在 Java 8之前,接口可以有常量變量和抽象方法。我們不能在接口中提供方法實現(xiàn)。如果我們要提供抽象方法和非抽象方法(方法與實現(xiàn))的組合,那么我們就得使用抽象類。
- 在 Java 8 接口引入了一些新功能——默認方法和靜態(tài)方法。
- Java 9 不僅像 Java 8 一樣支持接口默認方法,同時還支持私有方法
jdk1.9接口中可以有static、default、private方法、private static方法 同時他們都必須有方法體
接口的靜態(tài)方法能被重寫或實現(xiàn)嗎?
- 不可被重寫
- 不可被代理
靜態(tài)方法是屬于類的,不屬于對象,類哪有重寫或實現(xiàn),所以在其實現(xiàn)類里當然不能重寫或實現(xiàn) 在代理中也不會有此方法,userProxy里面都沒有,更別說被代理了,那是不可能的
defaultMethod可以被代理嗎?
可以被重寫(不強制),也可以被代理
privateMethod可以被代理嗎?
不可被重寫 不可被代理
只能在接口自己內(nèi)部調(diào)用,,都沒有權限訪問它當然不能被代理了,所以動態(tài)代理中根本不會有這個私有方法
當然為了證明這一點可以 使用接口的公共方法來間接調(diào)用它,看它到底有沒有被代理, // 而接口中可以有方法體的只有static、default、private方法,而static又不可以(static不可以調(diào)用非static方法),別無選擇,只能用default測了 發(fā)現(xiàn)private并沒有被代理
protected 、package下面方法可以被代理嗎?
這些修飾符在接口中都是不允許的,接口中都沒有,哪來的代理啊
總結
綜上所述只有public和default方法可以被代理,private和static都不可以,
- public可重寫可被代理(在實現(xiàn)類中重寫是強制的)
- private和static不可以被重寫也不可以被代理
- default可重寫可代理(在實現(xiàn)類中不強制必須重寫,不過不管重寫不重寫都會自動被代理)
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 { //調(diào)用目標方法之前做的公共邏輯 System.out.println("建立連接"); //調(diào)用目標方法,這句話必須要有的,就是調(diào)用被傳入的對象的方法(里面寫了核心代碼) Object object = method.invoke(t, args); //調(diào)用目標方法之后做的公共邏輯 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(); } }
到此這篇關于淺談Java中的private方法是否可以被代理的文章就介紹到這了,更多相關Java中的private方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java異常javax.net.ssl.SSLHandshakeException: SSL的解決方法
在Java開發(fā)過程中,SSL(Secure Sockets Layer)握手異常是一個常見的網(wǎng)絡通信錯誤,特別是在使用HTTPS協(xié)議進行安全通信時,本文將詳細分析javax.net.ssl.SSLHandshakeException: SSL這一異常的背景、可能的原因,并通過代碼示例幫助您理解和解決這一問題2024-12-12maven父子工程多模塊統(tǒng)一管理版本號的解決方法
maven父子工程多模塊,每個模塊還都可以獨立存在,子模塊往往通常希望和父工程保持一樣的版本,如果每個工程單獨定義版本號,后期變更打包也非常麻煩,,所以本文給大家介紹了maven父子工程多模塊如何管理統(tǒng)一的版本號,需要的朋友可以參考下2024-09-09解決java.util.NoSuchElementException異常的問題
這篇文章主要介紹了解決java.util.NoSuchElementException異常的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09SpringSecurity導致SpringBoot跨域失效的問題解決
本文主要介紹了SpringSecurity導致SpringBoot跨域失效的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01獲取系統(tǒng)參數(shù)System.getProperties()與配置文件參數(shù)@Value(“${key}“)
這篇文章主要介紹了獲取系統(tǒng)參數(shù)System.getProperties()與配置文件參數(shù)@Value("${key}"),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05Java中的springboot監(jiān)聽事件和處理事件詳解
這篇文章主要介紹了Java中的springboot監(jiān)聽事件和處理事件,這個示例展示了如何在Spring Boot應用中定義自定義事件、發(fā)布事件以及監(jiān)聽事件,需要的朋友可以參考下2024-07-07