`
xiaobian
  • 浏览: 581031 次
  • 来自: 北京
社区版块
存档分类
最新评论

静态代理,动态代理【java】

阅读更多

1.静态代理

 

接口或抽象类:

package com.bian.jdom.asyn;

public interface HelloWord {
    public void sayHello();
}

 

被代理的类:

package com.bian.jdom.asyn;

public class HelloWordImpl implements HelloWord {

    public HelloWordImpl(){
       
    }
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("Hello word ! ");
    }

}

静态代理类:

package com.bian.jdom.asyn;

public class StaticProxy implements HelloWord {
    HelloWord helloword = null;
    public StaticProxy(HelloWord helloword){
        this.helloword = helloword;
    }
   
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("调用之前处理一些事物");
        this.helloword.sayHello();
        System.out.println("调用之后处理一些事物");
       
    }

}

测试类:

package com.bian.jdom.asyn;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StaticProxy staticProxy = new StaticProxy(new HelloWordImpl());
        staticProxy.sayHello();
    }

}

 

说明:静态代理方式在新增一个方法的时候会同时修改

接口类 被代理的类 静态代理类。

 

代码量比较大,不够灵活,容易出错。

 

2.动态代理

接口类:

package com.bian.jdom.asyn;

import java.util.List;

public interface HelloWord {
     public void sayHello();
     public void sayName(String name);
     public List getList();
         
}

 

被代理类:

package com.bian.jdom.asyn;

import java.util.ArrayList;
import java.util.List;

public class HelloWordImpl implements HelloWord {

    public HelloWordImpl(){
       
    }
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("Hello word ! ");
    }
    public void sayName(String name){
        System.out.println(name);
    }
    public List getList(){
        List list = new ArrayList();
        list.add("name");
        return list;
    }
}

 

动态代理类:

package com.bian.jdom.asyn;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxy implements InvocationHandler {
    private Object object = null;
    public Object bind(Object obj){
        object = obj;
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
    }
   
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
            Object result = method.invoke(object, args);          
            return result;  
    }

}

 

测试类:

package com.bian.jdom.asyn;

import java.util.List;

public class TestDynamicProxy {
     public static void main(String[] args){         
                 HelloWord helloword = new HelloWordImpl();         
                 DynamicProxy proxy = new DynamicProxy();         
                 //在这里绑定的是HelloWord,也就是HelloWord是被代理接口。所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。         
                 HelloWord hello = (HelloWord)proxy.bind(helloword);          
                 hello.sayHello();     
                 hello.sayName("bian");
                 List list = hello.getList();
                 System.out.println(list.size()+" "+list.get(0).toString());
                      
             }         
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics