摘要:是一個接口中的代理與中的委托基本類似。而中代理對象是作為被代理對象的一個屬性。我們自己的處理邏輯還需要實現是加入了的自己的邏輯調用。成員變量可以看出,中的動態代理體現了中最重要的一點面向接口編程。這樣生成的代理類也是一個對象。
調用靜態常量不會引起初始化(調用初始化代碼塊)。但是要調用類的靜態方法當然會初始化類了
class Test{ static{ System.out.println("初始化"); } public final static String str="ffffd"; } public class Main { public static void main(String[] args) { System.out.println(Test.str); } }
輸出ffffd。
2.關于靜態代理與動態代理
public class ProxyTest { public static void main(String[] args){ Class clazz = Proxy.getProxyClass(Person.class.getClassLoader(), Person.class); System.out.println(clazz); System.out.println(Person.class); } } public interface Person { public void sayHello(); }
輸出:
class com.sun.proxy.$Proxy0
interface main.Person
為什么需要一個classloader,就是因為class是動態生成的。這個class就是代理對象。(也就是被擴展了的Person對象。Person是一個接口)
Java中的代理與OC中的委托基本類似。但是區別不同的是,JAVA中的代理對象包裹著被代理的對象(得到的是被擴展的Person對象)
。而OC中代理對象是作為被代理對象的一個屬性。(個人覺得,OC中的代理更能體現面向對象編程,尤其是對多態的理解。)
也就是說,java中的代理最終獲得的是代理對象(雖然是Person接口,但是不是我們自己處理邏輯的的那個實現對象),而在OC中獲得的是原對象。
Class proxyClass= Proxy.getProxyClass(Person.class.getClassLoader(), Person.class); InvocationHandler handler = new MyInvocationHandler(); Person f = (Person) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler); System.out.println(f);
proxyClass的getConstructor得到的是代理類的構造器對象,而不是person的構造器對象。
使用代理可以根據接口動態的生成對象,所謂的動態代理就是根據接口動態生成代理對象而已。
public class ProxyTest { public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{ Class proxyClass= Proxy.getProxyClass(Person.class.getClassLoader(), Person.class); InvocationHandler handler = new MyInvocationHandler(); Person person= (Person) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler); person.sayHello(); } } public class MyInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我被調用了!"); return null; } }
調用這個動態生成對象(擴展了的Person對象)的任何方法都將調用invoke方法。
動態代理:
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{ Class proxyClass= Proxy.getProxyClass(Person.class.getClassLoader(), Person.class); MyInvocationHandler handler = new MyInvocationHandler(); //person是一個接口。我們自己的處理邏輯還需要實現: handler.setTarget(new PersonImpl()); //person是加入了InvocationHandler的person: Person person= (Person )proxyClass.getConstructor(InvocationHandler.class).newInstance(handler); person.sayHello("Jetty"); } public class MyInvocationHandler implements InvocationHandler { private Person person; public void setTarget(Person target) { this.person = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { new Before().before(); method.invoke(person, args[0]);//自己的邏輯調用。成員變量person return null; } } public class Before { public void before(){ System.out.println("before"); } }
可以看出,java中的動態代理體現了java中最重要的一點:面向接口編程。這樣生成的代理類也是一個Person對象。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64678.html
摘要:要啟用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。為了達到最高效率,可要考慮在內包裝。 這些都是一些小問題,但是有助于理解輸入輸出流。InputStreamReader 中的一個 read()是每次只會從磁盤里面讀取一個字節。它會非常頻繁的訪問磁盤。(想一想,每次只從磁盤讀一個字節)InputStreamReader 是字節流通向字符流的...
摘要:此舉能夠使性能平均提高。盡可能使用局部變量調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧中速度較快,其他變量,如靜態變量實例變量等,都在堆中創建,速度較慢。 showImg(https://segmentfault.com/img/bVbsIIl?w=900&h=383);本文來源 |?http://atjf.top/3WLPmG 作者 | 萌小Q 01前沿 代碼優化 ,一個...
摘要:作為技術書籍或者視頻,講解一門語言的時候都是從最底層開始講解,底層的基礎有哪些呢首先是整個,讓我們對這門語言先混個臉熟,知道程序的基本結構,順帶著還會說一下注釋是什么樣子。 2018年新年剛過,就迷茫了,Java學不下去了,不知道從哪里學了。 那么多細節的東西,我根本記不住,看完就忘。 剛開始學習的時候熱情萬丈,持續不了幾天就慢慢退去。 作為技術書籍或者視頻,講解一門語言的時候都是...
摘要:前言到今天為止,正好是工作一年了。一年里有過折磨痛苦,有過成就感,一年后很欣慰能看到自己是有所收獲的。自己做出了一件很棒的事情完全可以拿去和別人炫耀,比如你用了一個很好的設計模式,比如你優化了一個功能讓他快了倍,比如你開發了一個很棒的工具。 前言 到今天為止,正好是工作一年了。一年里有過折磨痛苦,有過成就感,一年后很欣慰能看到自己是有所收獲的。記錄如下,如有不當,還望指點。 技術 看...
閱讀 2867·2021-10-08 10:12
閱讀 3966·2021-09-22 15:45
閱讀 2555·2019-08-30 15:52
閱讀 2625·2019-08-29 18:44
閱讀 2644·2019-08-29 12:37
閱讀 1154·2019-08-26 13:36
閱讀 2561·2019-08-26 13:34
閱讀 1473·2019-08-26 12:20