java中的动态代理

来源于http://langyu.iteye.com/blog/410071

和动态代理有关的有两个类

1.interface InvocationHandler 

Object invoke(Object proxy, Method method, Object[] args) 
2.class Proxy 

真正表示动态代理的类,提供两个静态方法:

Class<?> getProxyClass(ClassLoader loader, Class<?>[] interface) 

用来产生代理类,参数要提供interface数组,它会生成这些interface的“虚拟实现”, 用来冒充真实的对象。

Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 

产生代理对象,多了InvocationHandler参数(只是InvocationHandler接口的实现类),
它与代理对象关联,当请求分发到代理对象后,会自动执行h.invoke(…)方法, invoke方法就是我们用来做N多事情的地方 。

直接上代码:

//真实的接口:
public interface Hello {  
     void sayHello(String to);  
     void print(String p);   
}  
//真实实现类:
public class HelloImpl implements Hello {        
    public void sayHello(String to) {  
        System.out.println("Say hello to " + to);  
    }  

    public void print(String s) {  
        System.out.println("print : " + s);  
    }  

} 
//在这里生成与代理类相关联的InvocationHandler对象 
public class LogHandler implements InvocationHandler {  
    private Object dele;       
    public LogHandler(Object obj) {  
        this.dele = obj;  
    }  

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
        doBefore();  
        //在这里完全可以把下面这句注释掉,而做一些其它的事情  
        Object result = method.invoke(dele, args);  
        after();  
        return result;  
    }  

    private void doBefore() {  
        System.out.println("before....");  
    }  

    private void after() {  
        System.out.println("after....");  
    }  
}  
//测试类: 
public class ProxyTest {  

    public static void main(String[] args) {  
        HelloImpl impl = new HelloImpl();  
        LogHandler handler = new LogHandler(impl);  
        //这里把handler与impl新生成的代理类相关联  
        Hello hello = (Hello) Proxy.newProxyInstance(impl.getClass().getClassLoader(), impl.getClass().getInterfaces(), handler);  

        //这里无论访问哪个方法,都是会把请求转发到handler.invoke  
        hello.print("All the test");  
        hello.sayHello("Denny");  
    }  

}  

输出结果如下:

before....  
print : All the test  
after....  
before....  
Say hello to Denny  
after....  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值