1. 程式人生 > >反射機制與動態代理

反射機制與動態代理

以前學習基礎的時候不知道哪些是重點,也不會注意,自己動手少,用的少,自然也不會知道,就落下了知識點,當被問反射機制起來時,聽過,但怎麼說,到底是怎麼一回事,腦子一片空白,答不上來,也覺得慚愧。

一.什麼是反射機制?

在執行期中,對於任意一個類,都能夠呼叫某一個類的屬性與方法,或者對與一個物件,任意的物件都能呼叫這個物件的屬性和方法,這個類或物件相對其他類或物件像是透明的。這種動態的呼叫其他類或者物件的屬性和方法就叫做反射機制,JAVA反射機制:"程式執行時,允許改變程式結構或變數型別,這種語言稱為動態語言",這樣說你可能會感覺模模糊糊的,不太懂。

反射機制通過或者某個類或物件的位元組碼檔案物件(.class),這是必須的

,通過位元組碼物件就能獲取該類的屬性和方法,

獲取位元組碼檔案物件的三種方式,針對不同情況下選擇合理的使用

1、

原始碼階段,並沒有變成位元組碼檔案

//建立原始碼期的位元組碼檔案物件,引數為類的路徑即包名+類名,相對路徑即類名

Class a = Class.forName("A");

//建立例項物件

A a1 = (A)a.newInstance();

2、

編譯期後位元組碼階段

//建立編譯期的位元組碼檔案物件

Class a = A.class;

3、

建立物件階段

//建立物件

A as = new A();

//建立物件期的位元組碼檔案物件

Class a = as.getClass();

通過反射機制過去的位元組碼檔案物件能幹嘛?

假設已存在A類

1.建立實際物件

//建立編譯期的位元組碼檔案物件

Class a = A.class;

//建立例項物件

A a1 = (A)a.newInstance();

2.獲取該類的構造器

//建立編譯期的位元組碼檔案物件

Class a = A.class;

//通過位元組碼物件獲取無參構造器,通過構造器建立例項物件

Constructor constructor = a.getConstructor();

A a2 =(A)constructor.newInstance();

//帶參構造器

Constructor constructor1 = a.getConstructor(String.class);

System.out.println("初始化帶參構造器");

A a3 = (A)constructor1.newInstance("削功名");

3.獲取該類的屬性並輸出

//建立例項物件

Class a = A.class;

A a1 = (A)a.newInstance();

//呼叫該類的屬性,形參傳入屬性名

Field field = a.getDeclaredField("name");

//及那個私有的屬性開啟許可權

field.setAccessible(true);

//get方法引數傳入該類的例項物件

System.out.println(field.get(a1));

4.獲取該類的方法並執行

//建立編譯期的位元組碼檔案物件

Class a = A.class;

//建立例項物件

A a1 = (A)a.newInstance();

//呼叫該類方法(引數為該類的方法名)

Method method = a.getMethod("hello");

//引數傳入一個例項引數

method.invoke(a1);

二.動態代理

1.什麼是動態代理?

動態代理是一種設計模式,可以這麼理解,比如自己需要買一瓶水,自己不想動,叫人幫買一瓶水。這個代理物件是在程式執行過程中建立的,這個我們反射機制一樣在程式執行過程中來例項化物件、呼叫方法等操作。

建立代理物件需要使用 ava.lang.reflect下的 Proxy 類 和 InvocationHandler 介面; JDK提供的代理只能針對介面做代理,這意味著我們返回的必須是一個介面物件。更強的代理通過Proxy的newProxyInstance()方法建立動態代理物件。

1、建立一個介面,在介面中寫個方法

public interface A {

void buy();

}

2.建立一個InvocationHandle 代理物件

public class B implements InvocationHandler {

private Object target;



public B(Object a){

this.target = a;

}



@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

method.invoke(target,args);

System.out.print("代理物件: 某某");

return null;

}

}

3.建立一個例項類,並通過代理執行

public class C implements A {



@Override

public void buy() {

System.out.println("買水");

}



public static void main(String[] args) {

C a = new C() ;

//本身來做

a.buy();

System.out.println("----------------");

//傳入一個例項物件

B b = new B(a);

/**

* JDK提供的介面只能針對介面做代理。因此返回必須是個介面

* 引數為 例項物件的類載入器,類實現的所有介面的物件,代理物件

*/

A aa = (A)Proxy.newProxyInstance(a.getClass().getClassLoader(),a.getClass().getInterfaces(),b);

//代理來做

aa.buy();

}

}

相關推薦

Java反射機制動態代理(一)

導讀: 1. 什麼是反射 2. 反射的基本使用 3. 反射的使用例項 一、什麼是反射?   Java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這

Java反射機制動態代理(二)

導讀: 1. 代理模式 2. 靜態代理 3. 動態代理 4. 小結 一、代理模式 代理模式所涉及的角色有: 抽象主題角色:聲明瞭真實主題和代理主題的共同介面,這樣一來在任何可以使用真實主題的地方都可以使用代理主題。 真實主

反射機制動態代理

以前學習基礎的時候不知道哪些是重點,也不會注意,自己動手少,用的少,自然也不會知道,就落下了知識點,當被問反射機制起來時,聽過,但怎麼說,到底是怎麼一回事,腦子一片空白,答不上來,也覺得慚愧。 一.什麼是反射機制? 在執行期中,對於任意一個類,都能夠呼叫某一個類的

JAVA語言核心精講5-反射機制動態代理原理

談談 Java 反射機制,動態代理是基於什麼原理?典型回答反射機制是 Java 語言提供的一種基礎功能,賦予程式在執行時自省(introspect,官方用語)的能力。通過反射我們可以直接操作類或者物件,比如獲取某個物件的類定義,獲取類宣告的屬性和方法,呼叫方法或者構造物件,甚

Java 反射機制動態代理是基於什麼原理,瞭解過嗎?

工作多年以及在面試中,我經常能體會到,有些面試者確實是認真努力工作,但坦白說表現出的能力水平卻不足以通過面試,通常是兩方面原因: 1、“知其然不知其所以然”。 做了多年技術,開發了很多業務應用,但似乎並未思考過種種技術選擇背後的邏輯。坦白說,我並不放心把具有一定深度的任務交給他。 2、

簡談Java 反射機制動態代理

也有 object 持久化數據 多場景 字節 問控制 事情 獲取 ted 談談 Java 反射機制,動態代理是基於什麽原理?小編整理了一些java進階學習資料和面試題,需要資料的請加JAVA高階學習Q群:701136382 這是小編創建的java高階學習交流群,加群一起交流

PHP反射機制實現動態代理的程式碼

演示用程式碼如下所示: <?php class ClassOne { function callClassOne() { print "In Class One"; } } class ClassOneDelegator { private $targets; f

什麼是Java反射機制以及動態代理

反射機制定義 Java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法,對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。 反射機制獲取類的三種方式 1.類名.class

Java中的反射機制動態代理

一、反射概述   反射機制指的是Java在執行時候有一種自觀的能力,能夠了解自身的情況為下一步做準備,其想表達的意思就是:在執行狀態中,對於任意一個類,都能夠獲取到這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性(包括私有的方法和屬性),這種動態獲取的資訊以及動態呼叫物件的方法的功

類的加載機制反射——五、使用反射生成JDK動態代理

復用 他也 new mil ont throwable logs object load 使用反射生成JDK動態代理 1.使用Proxy和InvocationHandler創建動態代理 (1)Proxy提供了用於創建動態代理類和動態代理對象的靜態方法,他也是所有動態代理類的

java反射動態代理的理解

system 對象的訪問 讓我 integer 打破 類屬性 全部 列表 ces 一、什麽是反射機制?   反射的官方定義是這樣的:在運行狀態中,對於任意的一個類,都能夠知道這個類的所有屬性和方法,對任意一個對象都能夠通過反射機制調用一個類的任意方法,這種動態獲取類信息及動

基礎 | Java的反射動態代理

關於「反射」請參看Class類詳解(反射)部分。 動態代理作為Java反射的主要應用之一,其在多種JavaEE框架中均有使用,如Spring框架中AOP的實現原理就是動態代理,面試中提到AOP也必定會問 「談談對動態代理的理解?」 相關問題,在此做一個梳理與總結。 談

MyBatis實戰之解析執行 MyBatis之反射技術+JDK動態代理+cglib代理 MyBatis之反射技術+JDK動態代理+cglib代理 MyBatis之反射技術+JDK動態代理+cglib代理

本次所談的原理僅僅只涉及基本的框架和核心程式碼,並不會全部都說到,比如關於MyBatis是如何解析XML檔案和其他配置檔案從而的到內容,還有就是JDBC如何使用,關於JDBC如何使用,可以參考我的這篇部落格:單例模式和JDBC 還有就是關於Java基礎方面的內容,個人建議大家抽空看看《Java程式設計思想》

反射動態代理

反射是動態語言的關鍵,動態代理正是通過反射實現     一.靜態代理:    靜態代理是通過構建代理類物件,將被代理類物件以引數的形式傳遞給代理類物件,進而在代理類物件中呼叫被代理類的方法。 程式碼實現如下: 1.建立介面 2.定義

AOP的實現原理—反射動態代理

        其實AOP的意思就是面向切面程式設計。OO注重的是我們解決問題的方法(封裝成Method),而AOP注重的是解決許多問題的方法中的共同點,是對OO思想的一種補充!還是拿人家經常舉的一個

Java靜態代理動態代理模式的實現

loader 兩個 如何 圖片 ide 相同 catch 規範 png 前言: 在現實生活中,考慮以下的場景:小王打算要去租房,他相中了一個房子,準備去找房東洽談相關事宜。但是房東他很忙,平時上班沒時間,總沒有時間見面,他也沒辦法。後來,房東想了一個辦法,他找到了一個

淺談java中內置的觀察者模式動態代理的實現

所有 代理 notify play ani effect 一個 indicate protected 一.關於觀察者模式 1.將觀察者與被觀察者分離開來,當被觀察者發生變化時,將通知所有觀察者,觀察者會根據這些變化做出對應的處理。 2.jdk裏已經提供對應的Observer

【java】java反射機制動態獲取對象的屬性和對應的參數值,並屬性按照字典序排序,Field.setAccessible()方法的說明【可用於微信支付 簽名生成】

modifier 直接 this 字段值 1-1 讓我 toupper ima play 方法1:通過get()方法獲取屬性值 package com.sxd.test.controller; public class FirstCa{ private

AOP動態代理

什麽 編譯 spec 加載中 cglib 後者 監控 修改 打印 AOP AOP是指在jvm運行時, 動態將代碼切入到指定位置. OOP是一個維度上寫代碼, AOP是把他切開來, 變成立體的. 這樣的好處是: 業務邏輯跟輔助邏輯分離, 例如日誌打印, 性能監控, 安全控制

代理模式-靜態代理動態代理

應用 代碼 creat HR print tps 結果 inter OS 簡介 首先感謝沽泡學院 tom 老師 代理模式是一種結構型模式 代理模式就是代理對象幫被代理對象處理一些問題, 類似中介, 客戶只要結果, 中介怎麽搞是他的事兒, 他可能再處理過程中賺外快什麽的 代