Cglib
一 : 把增强器和拦截器放在一起
public class Dog { public void run(){ System.out.println("小狗正在吃东西。。。。"); } public void eat(){ System.out.println("小狗正在吃东西。。。。"); } }
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 myIMethodInterceptor implements MethodInterceptor { private Object target; public myIMethodInterceptor(Object target) { this.target = target; } public Object getInstance(){ //创建增强器 Enhancer enhancer = new Enhancer(); //设置代理目标类 enhancer.setSuperclass(target.getClass()); //设置回调函数 enhancer.setCallback(this); Object o = enhancer.create(); return o; } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("这就是增强哈。。上上。。。"); Object o1 = methodProxy.invokeSuper(o, objects); System.out.println("这就是增强哈。。。下下。。"); return o1; } }
import net.sf.cglib.core.DebuggingClassWriter; public class Demo { public static void main(String[] args) { System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "e:\\aaa"); //创建目标类 Dog target = new Dog(); //创建代理 myIMethodInterceptor proxy = new myIMethodInterceptor(target); Object d = proxy.getInstance(); Dog dd = (Dog)d; dd.eat(); dd.run(); } }
二 : 没把增强器和拦截器放在一起
import net.sf.cglib.core.DebuggingClassWriter; import net.sf.cglib.proxy.Enhancer; public class CglibProxy { public static void main(String[] args) { //在指定目录生成动态代理类 //我们可以反编译看一下里面的代码 System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "e:\\aaa"); //创建Enhanced对象,类似于JDK动态代理中的Proxy,下一步就是设置几个参数 Enhancer enhancer = new Enhancer(); //设置目标类的字节码文件 enhancer.setSuperclass(Dog.class); //设置回调函数 enhancer.setCallback(new MyMethodInterceptor()); //这里的creat方法就是正式创建代理类 Object o = enhancer.create(); Dog dog = (Dog) o; dog.run("黑子"); dog.eat(); } }
public class Dog { public void run(String name){ System.out.println("小狗的名字"+name+"....run"); } public void eat(){ System.out.println("狗。。。。eat"); } }
import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class MyMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("这是对目标类进行增强。。。。"); //注意这是方法的调用,不是反射 Object resout = methodProxy.invokeSuper(o,args); return resout; } }
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("这是对目标类进行增强。。。。");
//注意这是方法的调用,不是反射
Object resout = methodProxy.invokeSuper(o,args);
return resout;
}
}