一、步骤
jdk动态代理反射机制
package jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 调用处理器实现类
*/
public class JdkProxy implements InvocationHandler {
//需要增强的类
private Object target; //目标代理类
public JdkProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//开启事务
System.out.println("动态代理 开启事务");
Object result = method.invoke(target, args);
System.out.println("动态代理 提交事务");
return result;
}
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl(); //创建目标对象
JdkProxy jdkProxy = new JdkProxy(userDao); //创建调用处理器实现类
ClassLoader classLoader = userDao.getClass().getClassLoader(); //获取目标对象类的加载器
Class<?>[] interfaces = userDao.getClass().getInterfaces(); //获得userDao对象实现接口的数组。
/**
* Proxy动态代理类并返回代理类的一个实例
* 该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
*/
UserDao userDao1 =(UserDao) Proxy.newProxyInstance(classLoader, interfaces, jdkProxy);
userDao1.test();
}
}
二、Cglib代理
步骤
package cglibProxy;
import jdkproxy.UserDao;
import jdkproxy.UserDaoImpl;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
//字节码asm
public class CglibInterceptor<T> implements MethodInterceptor { //cglib 代理实现
//需要增强的类
private T target; //目标代理类
public T getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return (T)enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//开启事务
System.out.println("代理 开启事务");
Object result = methodProxy.invoke(target, objects);
System.out.println("代理 提交事务");
return result;
}
public static void main(String[] args) {
CglibInterceptor cglibInterceptor = new CglibInterceptor();
UserDao userDao1 = (UserDao)cglibInterceptor.getInstance(new UserDaoImpl());
userDao1.test();
}
}