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

动态代理-JDK_proxy&cglib

2015-01-26 00:00 411 查看
摘要: 动态代理的实现方式较常用的方式有两种,用jdk的proxy类实现,必须依赖接口。或者使用cglib的扩展包实现,因为是产生类的子类所以代理的类不能为final类。

一、简介

动态代理的实现方式较常用的方式有两种,用jdk的proxy类实现,必须依赖接口。或者使用cglib的扩展包实现,因为是产生类的子类所以代理的类不能为final类。

二、示例

1、 其中UserServiceImpl 是 UserService的实现

( UserServiceImpl implements UserService )

2、使用JDK的Proxy进行代理

import java.lang.reflect.Proxy;
...

public class JDKProxyTestMain {

public static void main(String[] args) {
UserService proxyUserService = (UserService) Proxy
.newProxyInstance(UserServiceImpl.class.getClassLoader(),
UserServiceImpl.class.getInterfaces(),
new JDKInvocationHandler(new UserServiceImpl()));
proxyUserService.save();
}
}

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

public class JDKInvocationHandler implements InvocationHandler {
private Object targetObject;

public JDKInvocationHandler(Object targetObject) {
this.targetObject = targetObject;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("--1---");
Object result = method.invoke(targetObject, args);
System.out.println("--2---");
return result;
}

}

3、使用cglib进行代理实现

import net.sf.cglib.proxy.Enhancer;
...

public class CglibTestMain {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserServiceImpl.class);
enhancer.setCallback(new CglibMethodInterceptor(new UserServiceImpl()));
UserServiceImpl userServiceProxy= (UserServiceImpl) enhancer.create();
userServiceProxy.save();
}
}

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibMethodInterceptor implements MethodInterceptor {
private Object targetObj;

public CglibMethodInterceptor(Object targetObj) {
this.targetObj = targetObj;
}

@Override
public Object intercept(Object proxyObj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("---begin---");
Object result = method.invoke(this.targetObj, args);
System.out.println("---end---");
return result;
}

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