动态代理的演示
使用动态字节码生成技术实现AOP原理是在运行期间目标字节码加载后,生成目标类的子类,将切面逻辑加入到子类中,所以使用Cglib实现AOP不需要基于接口
定义两个接口
package AOP;public interface Business1 {public void show_Business1();}package AOP;public interface Business2 {public void show_Business2();}package AOP;public class Business implements Business1, Business2 {@Overridepublic void show_Business2() {System.out.println("show_Business2");}@Overridepublic void show_Business1() {System.out.println("show_Business1");}}package AOP;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class LogInvocationHandler implements InvocationHandler {private Object target; // 目标对象LogInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// 执行原有逻辑Object rev = method.invoke(target, args);System.out.println(method.getName()+":");return rev;}}package AOP;import java.lang.reflect.Proxy;public class DynamicProxyDemo {/** * @param args */public static void main(String[] args) {Class[] proxyInterface = new Class[] { Business1.class, Business2.class };ClassLoader classLoader = DynamicProxyDemo.class.getClassLoader();LogInvocationHandler logInvocationHandler = new LogInvocationHandler(new Business());Business1 business1=(Business1)Proxy.newProxyInstance(classLoader, proxyInterface,logInvocationHandler);business1.show_Business1();((Business2)business1).show_Business2();}}package Cglib;import net.sf.cglib.proxy.Enhancer;public class CglibTest {public static void main(String[] args) {byteCodeGe();}public static void byteCodeGe() {// 创建一个织入器Enhancer enhancer = new Enhancer();// 设置父类enhancer.setSuperclass(Business.class);// 设置需要织入的逻辑enhancer.setCallback(new LogIntercept());// 使用织入器创建子类Business newBusiness = (Business) enhancer.create();newBusiness.show_Business1();newBusiness.show_Business2();}}package Cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/** * 记录日志 */public class LogIntercept implements MethodInterceptor {@Overridepublic Object intercept(Object target, Method method, Object[] args,MethodProxy proxy) throws Throwable {// 执行原有逻辑,注意这里是invokeSuperObject rev = proxy.invokeSuper(target, args);// 执行织入的日志System.out.println("记录日志");return rev;}}package Cglib;public class Business {public void show_Business2() {System.out.println("show_Business2");}public void show_Business1() {System.out.println("show_Business1");}}public static void main(String[] args) throws Throwable {//获取存放CtClass的容器ClassPool ClassPool cp = ClassPool.getDefault(); CtClass cc = cp.get(className);//CtMethod targetM = null;CtMethod targetM = cc.getDeclaredMethod("doSomeThing");targetM.insertBefore("{ System.out.println("记录日志前"); }");targetM.insertAfter("{ System.out.println("记录日志后"); }");Class c = cc.toClass();Business b = (Business) c.newInstance();b.doSomeThing2();b.doSomeThing();}public class Business { public boolean doSomeThing() { System.out.println("doSomeThing"); return true; } public void doSomeThing2() { System.out.println("doSomeThing2"); } }