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