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

基于jdk proxy的动态代理模式

2014-04-12 16:46 337 查看
代理模式 是spring AOP机制的实现基础,有必要学习一下。

有两种,一种是目标类有接口的, 采用JDK动态代理,一种是目标类没接口的,采用CGLIB动态代理。

先看一组代码,

package com.sinosoft.proxy;

public interface UserInterface {

public abstract void add();
public abstract void delete();

}

package com.sinosoft.proxy;

public class UserInterfaceImpl implements UserInterface{

@Override
public void add() {
System.out.println("add add add");

}

@Override
public void delete() {
// TODO Auto-generated method stub
System.out.println("delete delete delete");
}

}


输出结果如下,



现在,我们提出需求,我们希望用户在每个操作的时候都记录日志
该怎么做?
我们这时就可以使用 动态代理机制 , 通过动态代理 Factory ( 相当于 Spring 容器 ) 来生成代理实例 。
由代理对象来完成该功能。

第一,JDK动态代理方式

package com.sinosoft.proxy;

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

public class ProxyFactory implements InvocationHandler{
private Object target;

private ProxyFactory(){}

public static ProxyFactory getInstance(){

//Runtime
return new ProxyFactory();
}

public Object getProxy(Class clazz){
Object proxy=Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
return proxy;

}

@Override
public Object invoke(Object object, Method method, Object[] params)
throws Throwable {
// TODO Auto-generated method stub
Object retVal=null;
try {
System.out.println("before....");
retVal=method.invoke(target, params);
System.out.println("ater.....");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("exception.....");
}finally{
System.out.println("finally....");
}
return retVal;
}
}

package com.sinosoft.proxy;

import org.junit.Test;

public class ProxyTest {
@Test

//public static void main(String[] args) {
public void test1(){

UserInterfaceImpl userimpl=new UserInterfaceImpl();
userimpl.add();
userimpl.delete();
}

//}

@Test
public void test2(){
ProxyFactory factory=ProxyFactory.getInstance();

UserInterface userinterface=(UserInterface)factory.getProxy(new UserInterfaceImpl().getClass());

System.out.println(userinterface.getClass());
userinterface.add();
userinterface.delete();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: