java 的動態代理
java 的動態代理
什麼是代理?代理模式就是在原有的服務上多加了一個佔衛,通過這個佔衛去控制服務的訪問。
動態代理示意圖如下:
使用動態代理的原因:
1.一方面可以控制如何訪問真正的物件,提供額外的服務;
2.另一方面可以重寫一些類來滿足特定的需要
一般動態代理分為兩種:1.jdk反射機制提供的代理 2.cglib提供的代理
反射技術
/**
* java 反射測試
* @author cp
*
*/
public class ReflectService {
public void sayHello(String name) {
System.out.println("hello" + name);
}
public static void main(String[] args) throws InstantiationException,
IllegalAccessException, ClassNotFoundException,
NoSuchMethodException, SecurityException, IllegalArgumentException,
InvocationTargetException {
Object service = Class.forName(ReflectService.class.getName())
.newInstance();
Method method = service.getClass().getMethod("sayHello", String.class);
method.invoke(service, "小鵬要逆襲");
}
}
執行結果:
jdk動態代理技術
jdk的動態代理,是由java.lang.reflect.*包來提供的,我們需要完成幾個步驟
1.編寫服務類和介面,作為真正的服務提供者(jdk代理中必須)
2.編寫代理類,提供繫結和代理的方法
a.建立HelloService類
package com.xiaopeng.test;
public interface HelloService {
public void sayHello(String name);
}
b.建立HelloServiceImpl類實現了HelloService介面
package com.xiaopeng.test;
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello(String name) {
System.out.println("Hello"+name);
}
}
c.建立jdk的動態代理類,實現InvocationHandler
package com.xiaopeng.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HelloServiceProxy implements InvocationHandler {
/**
* 真實的物件
*/
private Object target;
/**
* 繫結真實的物件
* @param target
* @return
*/
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("===========這是JDK動態代理=========");
Object result = null;
System.out.println("我準備說hello");
result = method.invoke(target, args);
System.out.println("我說過hello了");
return result;
}
}
d.單元測試
@Test
public void testDemo03(){
// 建立服務的動態代理物件
HelloServiceProxy helloServiceProxy = new HelloServiceProxy();
HelloService proxyService = (HelloService) helloServiceProxy.bind(new HelloServiceImpl());
proxyService.sayHello("小鵬要逆襲");
}
e.執行結果截圖:
CGLIB動態代理
jdk提供的動態代理有一個缺陷,就是必須要提供介面才可以使用。為了克服這個問題,我們使用CGLIB動態代理。
需要匯入的包:
a.建立cglib動態代理物件的類,實現MethodInterceptor介面
package com.xiaopeng.test;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class HelloServiceCGLIB implements MethodInterceptor {
private Object target;
public Object getInstance(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("============我是cglib的動態代理===========");
System.out.println("我準備說hello");
Object returnObject = proxy.invokeSuper(obj, args);
System.out.println("我說過hello了");
return returnObject;
}
}
b.單元測試
@Test
public void testDemo04(){
HelloServiceCGLIB helloServiceCGLIB = new HelloServiceCGLIB();
HelloService proxyService = (HelloService) helloServiceCGLIB.getInstance(new HelloServiceImpl());
proxyService.sayHello("hdasl");
}
c.執行結果
相關文章
- JAVA 靜態代理 & 動態代理Java
- Java中的靜態代理和動態代理Java
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- java靜態代理和動態代理Java
- java動態代理Java
- 【JAVA】代理模式之Java動態代理Java模式
- java動態代理動態在哪裡?Java
- Java動態代理(AOP)Java
- java動態代理(1)Java
- Java Proxy動態代理Java
- java動態代理原理Java
- 輕鬆理解 Java 靜態代理/動態代理Java
- 對JAVA動態代理的理解Java
- 讓我們打一場動態代理的官司–Java動態代理Java
- Java動態程式設計---動態代理Java程式設計
- Java進階--Java動態代理Java
- Java基礎系列-靜態代理和動態代理Java
- JAVA學習篇--靜態代理VS動態代理Java
- Java 8 動態代理的新技巧(1):為什麼使用動態代理?Java
- Java 動態代理newProxyInstanceJava
- 動態代理及java演示Java
- java動態代理如何使用Java
- java 反射和動態代理Java反射
- Java 動態代理深入解析Java
- Java Web之動態代理JavaWeb
- Java 靜態代理和動態代理的使用及原理解析Java
- (轉)Java動態代理與CGLib代理JavaCGLib
- Java進階之 JDK動態代理與Cglib動態代理JavaJDKCGLib
- Java架構-Java JDK 動態代理Java架構JDK
- java | 什麼是動態代理?Java
- java 動態代理簡單使用Java
- Java設計模式-之代理模式(動態代理)Java設計模式
- java的動態代理機制詳解Java
- java執行原理、靜態代理和動態代理區分Java
- 設計模式總結——代理模式以及java的動態代理設計模式Java
- Java設計模式學習06——靜態代理與動態代理Java設計模式
- SAP ABAP和Java的動態代理實現Java
- 用大白話講Java動態代理的原理Java