採用動態代理的方式對一個類進行增強
- 建立一個介面
package com.itheima.proxy;
/*
* 服務員的介面
*/
public interface Waiter {
public void server();
public String sayHello(String name);
}
- 建立一個類來實現這個介面
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;
}
}
- 採用動態代理的方式對這個類進行增強並且呼叫方法
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)在