Java代理(二)

前面说到了java的静态代理,这次来看看动态代理。

假设有如下接口和实现方法:

package proxy;



public interface Subject {

    public void request();

    public void response();

}
View Code
package proxy;



public class RealSubject implements Subject{



    public void request() {

        System.out.println("request...");

    }



    public void response() {

        System.out.println("response...");

    }



}
View Code

然后,需求来了,希望在执行方法前后加某个其他的操作,那么动态代理会这么做:

package proxy.dynamicProxy;





import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;



public class ProxyHandle implements InvocationHandler{

    private Object target;//目标对象

    public ProxyHandle(Object target){

        this.target = target;

    }

    

    public Object invoke(Object proxy, Method method, Object[] args)

            throws Throwable {

        System.out.println("before...");

        Object retrunObj = method.invoke(target, args);

        System.out.println("afeter...");

        return retrunObj;

    }

}
View Code

然后客户端的代码会这么写:

package proxy.dynamicProxy;



import java.lang.reflect.Proxy;



import proxy.RealSubject;

import proxy.Subject;



public class DynamicProxyTestMain {



    public static void main(String[] args) {

        RealSubject subject = new RealSubject();

        Subject proxySubject = (Subject) Proxy.newProxyInstance(subject

                .getClass().getClassLoader(), subject.getClass()

                .getInterfaces(), new ProxyHandle(subject));

        proxySubject.request();

        

        //proxySubject.response();

    }



}
View Code

从上面的代码页可以看出,一旦接口变了,代理类是不需要做改变的~~

但是java的动态代理依赖于接口,如果现有代码中没有接口怎么办,岂不是不能使用java的动态代理了??

怎么破?使用cglib...

 

 

 

你可能感兴趣的:(java代理)