本帖最后由 刘海芳 于 2013-6-5 09:47 编辑
额,因为实现了InvocationHandler的那个动态代理生成类可以你通过参数的不同,动态的生成不同的代理对象,而不是静态代理那样,要为每个代理类都写一个中间的代理对象,就程序的灵活上看像就是动态的,因为,无论你要生成任何的代理对象都用那个了,附静态代理和动态代理的代码区别...
静态代理:- package ttitfly.proxy;
-
- public interface HelloWorld {
- public void print();
- }
- package ttitfly.proxy;
-
- public class HelloWorldImpl implements HelloWorld{
-
- public void print(){
- System.out.println("HelloWorld");
- }
- }
- public class StaticProxy implements HelloWorld{
-
- public HelloWorld helloWorld ;
- public StaticProxy(HelloWorld helloWorld){
- this.helloWorld = helloWorld;
- }
-
- public void print(){
- System.out.println("Welcome");
- //相当于回调
- helloWorld.print();
- }
- }
复制代码 动态代理:- package ttitfly.proxy;
-
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- //动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
- public class DynamicProxy implements InvocationHandler{
-
- private Object object;
- //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
- //Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法
- public Object bindRelation(Object object){
- this.object = object;
- return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
- }
- //拦截关联的这个实现类的方法被调用时将被执行
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("Welcome");
- Object result = method.invoke(object, args);
- return result;
- }
- }
复制代码 |