一、步骤
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 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;
public class CglibInterceptor<T> implements MethodInterceptor {
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();
}
}