動態代理,有兩種情況,第一種是有接口的情況下,你可以選擇為jdk自帶的動態代理的方式來編寫程序,但你想要為一個實在的類編寫動態代理的方式的話,這時候就必須選擇一些開源的lib包,如cglib包,同時還需要asm包。
cglib用於AOP,jdk中的proxy必須基於接口,cglib卻沒有這個限制。
第一種通過jdk的動態代理(必須接口):
主類(實現主要方法的類)接口:
- package bean;
- public interface TestInter {
- public void save();
- }
- 具體類:
- package bean;
- public class TestClass implements TestInter{
- public void save(){
- System.out.println("調用TestClass.save()");
- }
- }
代理類:
- package bean;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import org.apache.log4j.Logger;
- public class Test implements InvocationHandler {
- private Object originalObject;
- public Object bind(Object obj) {
- System.out.println("coming here...");
- this.originalObject = obj;
- return Proxy.newProxyInstance(
- obj.getClass().getClassLoader(),
- obj.getClass().getInterfaces(),this
- );
- }
- /**
- * 反射?
- */
- public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
- Object result=null;
- if(arg1.getName().startsWith("save")){
- System.out.println("start...");
- result=arg1.invoke(this.originalObject,arg2);
- System.out.println("end...");
- }
- return result;
- }
- }
測試類:
- package bean;
- public class TestMain {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Test test=new Test();
- TestClass tc=new TestClass();
- try{
- ((TestInter)test.bind(tc)).save();
- }catch(Exception e){
- System.out.println(e.getMessage());
- e.printStackTrace();
- }
- }
- }
運行結果:
- coming here...
- start...
- 調用TestClass.save()
- end...
第二種方法:
主類(實現主要方法的類):
- package cglib;
- public class TestClass {
- public void save(){
- System.out.println("調用TestClass.save()");
- }
- }
攔截器類(實現功能的地方):
- package cglib;
- import java.lang.reflect.Method;
- import net.sf.cglib.proxy.MethodInterceptor;
- import net.sf.cglib.proxy.MethodProxy;
- /**
- * 實現接口MethodInterceptor
- */
- public class MyMethodInterceptor implements MethodInterceptor {
- /**
- * 攔截器,在這里實現需要的功能
- * 在這里僅僅是在執行之前打印了start 在執行之后打印了end
- */
- public Object intercept(Object arg0, Method arg1, Object[] arg2,
- MethodProxy arg3) throws Throwable {
- System.out.println("start...");
- Object result = arg3.invokeSuper(arg0,arg2);
- System.out.println("ending...");
- return result;
- }
- }
創建代理的類:
- package cglib;
- import net.sf.cglib.proxy.Enhancer;
- public class TestProxy {
- /**
- * 創建代理類
- * @param targetClass
- * @return
- */
- public Object createProxy(Class targetClass){
- Enhancer enhancer = new Enhancer();
- //設定父類???
- enhancer.setSuperclass(targetClass);
- //這里貌似是進行回調,主要的操作被放進了MyMethodInterceptor類里
- enhancer.setCallback(new MyMethodInterceptor());
- return enhancer.create();
- }
- }
測試類
- package cglib;
- public class TestMain {
- /**
- * 測試類
- * @param args
- */
- public static void main(String[] args) {
- TestClass tc=new TestClass();
- TestProxy tp=new TestProxy();
- TestClass tcp=(TestClass)tp.createProxy(tc.getClass());
- tcp.save();
- }
- }
運行結果:
- start...
- 調用TestClass.save()
- ending...