Spring第六篇【動態代理入門】
阿新 • • 發佈:2020-08-16
jdk動態代理
import com.example.demo.jdk.Advice; import com.example.demo.jdk.Target; import com.example.demo.jdk.TargetInterface; import org.junit.Test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MyTest { @Test public void test() { Target target = new Target(); Advice advice = new Advice(); TargetInterface t = (TargetInterface) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { advice.before(); Object invoke = method.invoke(target, objects); advice.after(); return invoke; } } ); t.save(); } }
cglib動態代理
import com.example.demo.jdk.Advice; import com.example.demo.jdk.Target; import org.junit.Test; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class MyTest { @Test public void test01(){ Target target = new Target(); Advice advice = new Advice(); //1. 建立增強器 Enhancer enhancer = new Enhancer(); //2. 將目標類設定為父類 enhancer.setSuperclass(Target.class); //3. 設定回撥 enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { advice.before(); // 前置增強 Object invoke = method.invoke(target, objects); advice.after(); // 後置增強 return invoke; } }); //4. 建立代理物件 Target t = (Target) enhancer.create(); t.save(); } }