您的位置:首页 > 编程语言 > Java开发

java的动态代理设计模式

2015-10-13 21:41 597 查看
代码实现:

package com.lky.proxy;

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

public class DynamicProxy implements InvocationHandler {

private Object obj;//被调用的目标对象

public DynamicProxy(Object obj) {
this.obj = obj;
}

/**
* @Title: invoke
@param arg0
@param arg1  被调用目标对象的方法
@param arg2  被调用目标对象方法的参数
@return
@throws Throwable    参数
* @return    返回类型
*/
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
Object result = null;
doBefore();
result = arg1.invoke(obj, arg2);
doAfter();
return result;
}

//工厂模式生成动态动态代理
public static Object proxyFactory(Object object) {
Class<? extends Object> cls = object.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), new DynamicProxy(object));
}

public void doBefore() {
System.out.println("初始化。。。。。。。。。");
}

public void doAfter() {
System.out.println("日志处理。。。。。。。。。");
}
}


测试代码:

package com.lky.proxy;

import org.junit.Test;

public class testProxy {

@Test
public void test(){
Cat cat=new Cat();
Animal animal=(Animal)DynamicProxy.proxyFactory(cat);
animal.eat();
System.out.println("-------------------");
animal.sleep();
System.out.println("-------------------");

Car car=new Car();
Vehicle vehicle=(Vehicle)DynamicProxy.proxyFactory(car);
vehicle.run();
System.out.println("-------------------");
vehicle.stop();
}

}

注:

抽象角色(抽象类或接口),真实角色(真正实现了业务逻辑接口),代理角色(自己并未实现业务逻辑接口,而是调用真实角色来实现),这里接口和接口的实现没有列举,只列举了动态代理生成

一个类要能处理动态代理必须实现InvocationHandler 接口

动态代理的获取需要Proxy的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法来生成

invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: