1. 程式人生 > >採用動態代理的方式對一個類進行增強

採用動態代理的方式對一個類進行增強

  1. 建立一個介面
package com.itheima.proxy;
/*
 * 服務員的介面
 */
public interface Waiter {

    public void server();

    public String sayHello(String name);
}
  1. 建立一個類來實現這個介面
package com.itheima.proxy;
/*
 * 服務員的實現類
 */
public class Waitress implements Waiter {

    @Override
    public void server() {
        System.out.println("服務中......"
); } @Override public String sayHello(String name) { return "Hello" + name; } }
  1. 採用動態代理的方式對這個類進行增強並且呼叫方法
package com.itheima.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.junit.Test;

public
class ProxyDemo1 { @Test public void demo1(){ Waiter waiter = new Waitress(); //waiter.server(); //使用動態地代理:Proxy, newProxyInstance /* * ClassLoader :類載入器 * class[] :被增強的物件實現的所有介面 * InvocationHandler :處理類 */ //第一個引數
ClassLoader classLoader = waiter.getClass().getClassLoader(); //第二個引數 Class[] interfaces = waiter.getClass().getInterfaces(); //第三個引數 //相當於Waiter的實現類 Waiter waiter2 = (Waiter)Proxy.newProxyInstance(classLoader, interfaces, new MyInvocationHandler(waiter) ); //waiter2.server(); //說明現在呼叫代理物件的任何方法的時候,InvocationHandler中的invoke方法執行 //waiter2.sayHello("張三"); String s = waiter2.sayHello("李四"); System.out.println(s); } } class MyInvocationHandler implements InvocationHandler{ private Waiter waiter; public MyInvocationHandler(Waiter waiter){ this.waiter = waiter; } @Override /* * 方法的引數: * proxy :產生的代理物件 * method :當前正在呼叫的目標類的方法 * obj :正在執行的方法中的引數 * */ public Object invoke(Object proxy, Method method, Object[] params) throws Throwable { //System.out.println("InvocationHandler invocake執行了....."); //waiter.server(); //System.out.println(method.getName()); //利用反射使特定的方法執行 Object obj = method.invoke(waiter, params); return obj; } }

相關推薦

採用動態代理方式一個進行增強

建立一個介面 package com.itheima.proxy; /* * 服務員的介面 */ public interface Waiter { public void server(); public String say

javaEE Mybatis,Mybatis與Spring整合之動態代理方式(推薦),自動建立Dao層實現

src/applicationContext.xml(Spring核心配置檔案): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.or

Spring通過註解annotation方式注入Bean時,採用動態代理,那麼JDK代理和CGLIB代理區別?

切面程式設計是Spring中非常重要的一個模組,切面程式設計的實現原理是動態代理,那麼動態代理又有兩種實現方式:一種方法是直接實現JDK中的InvocationHandler介面,另一種方法是繼承CGLIB。 首先如果不是很清楚兩者的區別的話,記住一般情況下Invocati

django域名反向解析、檢視、利用建立方式預設表格進行修改、檢查郵箱是否被註冊、更改密碼介面

域名反向解析:當路徑發生改變後固定路徑需要改變,通過反向解析可以自動尋找並修改 huasheng/urls.py下 新增namespace url(r'^user/',include('user.urls',namespace='user')), 各應用urls.py下 新增name u

02.MyBatis在DAO層開發使用的Mapper動態代理方式

.get div 技術 before nco mes session list http   在實際開發中,Mybatis作用於DAO層,那麽Service層該如何調用Mybatis   Mybatis鼓勵使用Mapper動態代理的方式   Mapper接口開發方法只需要程

Mapper 動態代理方式

exc exception 類方法 文件中 方式 只需要 prop 類型 sel Mapper接口開發方法只需要程序員編寫Mapper接口(相當於Dao接口),由Mybatis框架根據接口定義創建接口的動態代理對象,代理對象的方法體同上邊Dao接口實現類方法。 Mapper

使用squid配置透明代理上網行為進行控制

install mes 10.10 path ces 透明代理服務器 限制 BE lB 使用Squid配置透明代理環境:CentOS 6.4 + squid-3.1.10-20.el6_5.3.x86_64 1.檢查squid是否默認安裝,沒有安裝先安裝 rpm -qa

Java中動態代理方式

tint lap cto getname AI clas tcl show this JDK中生成代理對象的API 代理類所在包:java.lang.reflect.ProxyJDK實現代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數,完整的

OpenGL實驗二 利用滑鼠、鍵盤,選單等方式圖元進行互動操作

實驗目的: 利用滑鼠、鍵盤,選單等方式對圖元進行互動操作   實驗內容: 1、用滑鼠拖動畫直線,線段終點始終跟隨滑鼠移動; 2、使用選單介面修改直線的顏色; 3、利用鍵盤控制直線在螢幕上移動;   可以改進的設想: 1.做一

動態代理方式來解決全域性亂碼(get/post提交)

final HttpServletRequest req = (HttpServletRequest) request; // 使用動態代理完成全域性編碼 HttpServletRequest enhanceRequest = (HttpServletRequest) Proxy.new

DJANGO專案用WEB的方式MYSQL資料庫進行備份匯出等管理任務的實現

環境:PYTHON2.7,DJANGO1.9.9 urls.py 加一行: url(r'^mysqldatamanage/', views.mysqldatamanage,name='mysqldatamanage'),   views.py新增對應的方mysqldatam

使用jaxp解析器dom方式xml節點進行操作

    作為一名初學者,對一些程式語言感覺不是很簡單。尤其是正在學習的Javaweb這一部分的內容,非常駁雜,讓人頭大。     看過一些書,也包括聽一些人說,寫部落格有利於理解和記憶。作為一名初學者,我抱著學習和積累的心理,開始我的部

Java--如何使用多執行緒一個HashSet進行平行計算

這段時間工作比較忙。今天抽空整理了一個多執行緒使用場景。 當處理一個數據量比較大的集合時(每個元素的計算都耗時比較長)。由於只使用一個執行緒進行計算比較慢。所以想到多跑幾個執行緒進行處理。 1.每個執行緒可以自行計算要處理集合的開始和結束索引,確保每一個元素都被計算的到。

Confluence 6 一個空間進行歸檔後產生的影響

空間 如果一個空間被歸檔: 將不會在查詢結果中顯示,除非你選擇 在歸檔空間中查詢(Search archived spaces)。如果沒有歸檔空間的話,這個功能是隱藏的。 頁面和內容將不會在 Confluence 的內容 快速查詢(quick search)中顯示,這個被用

MyBatis開發Dao層的兩種方式(Mapper動態代理方式

  MyBatis開發原始Dao層請閱讀我的上一篇部落格:MyBatis開發Dao層的兩種方式(原始Dao層開發)   接上一篇部落格繼續介紹MyBatis開發Dao層的第二種方式:Mapper動態代理方式   Mapper介面開發方法只需要程式設計師編寫Mapper介面(相當於Dao介面),由Mybat

tensorflow 怎麼一個tensor進行所有元素相加求和

tensor 和 numpy不同。 使用np.sum對一個tensor求和是不能得到一個標量的。 所以需要使用tensorflow自帶的函式對tensor進行求和。 總的來說,這裡我們需要明白一點,tensor資料使用tensorflow的函式運算,否則會出錯。 這裡僅給出對一個

Mybatis進階學習筆記——動態代理方式開發Dao介面、Dao層(推薦第二種)

1.原始方法開發Dao  Dao介面 1 package cn.sm1234.dao; 2 3 import java.util.List; 4 5 import cn.sm1234.domain.Customer; 6 7 public interface Custo

三種實現動態代理方式(jdk、cglib、javaassist)

在編寫程式與實現某些功能時,我們經常會使用到動態代理。動態代理是個很簡單但是很有效的東西。在我們平時使用的框架中,像servlet的filter、包括spring提供的aop以及struts2的攔截器都使用了動態代理功能。我們日常看到的mybatis分頁外掛,以及日誌攔截、

Spring AOP --JDK動態代理方式

我們知道Spring是通過JDK或者CGLib實現動態代理的,今天我們討論一下JDK實現動態代理的原理。 一、簡述 Spring在解析Bean的定義之後會將Bean的定義生成一個BeanDefinition物件並且由BeanDefinitionHolder物件持有。在

定義Person(人),由Person分別派生出Teacher(教師)和Cadre(幹部),再由Teacher(教師)和Cadre(幹部)採用多重繼承方式派生出新TeacherCadre(

要求: (1)在Person類中包含的資料成員有姓名(name)、年齡(age)、性別(sex)。在Teacher類還包含資料成員職稱(title),在Cadre類中還包含資料成員職務(post),在TeacherCadre類中還包含資料成員工資(wages)。 (2)在