码迷,mamicode.com
首页 > 编程语言 > 详细

浅谈-Java设计模式之动态代理

时间:2016-05-18 17:38:18      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

动态代理模式(Dynamic Proxy Pattern):

在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。
首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的:

InvocationHandler该接口唯一方法 invoke(Object proxy, Method method, Object[] args)

 
Object invoke(Object proxy, Method method, Object[] args) throws Throwable

 


还是原先的例子 hello
 
package com.ant;
 
public interface Hello {
 
    public void say();
}
 

 

package com.ant;
 
public class HelloImpl implements Hello {
 
    @Override
    public void say() {
        System.out.println("hellw world!");
 
    }
 
}

 

package com.ant;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
 
public class HelloHandle implements InvocationHandler{
 
    private Object obj;
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        doBefore();
        result = method.invoke(    obj,args);
        doAfter();
        return result;
    }
 
    public HelloHandle(Object obj){
        super();
        this.obj = obj;
        System.out.println("初始化invocationHandler实例");
    }
 
    private void doBefore(){
        System.out.println("代理前");
    }
    private void doAfter(){
        System.out.println("代理后");
    }
}

 

package com.ant;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
 
public class HelloTest {
 
    public static void main(String[] args) {
        Hello hello = new HelloImpl();
        InvocationHandler handle = new HelloHandle(hello);
 
        //动态创建一个代理对象的类
         
        Hello proxy = (Hello)Proxy.newProxyInstance(hello.getClass().getClassLoader(),hello.getClass().getInterfaces(), handle);
        proxy.say();
        System.out.println(proxy.getClass().getName());
    }
}

 

运行结果 :
 
浅谈-Java设计模式之动态代理

 

通过Proxy.newProxyInstance创建了一个Hello 代理类,当然也可以指定不同的参数创建不同接口的代理实现类或同一个接口不同操作的代理实现类。
 
来看看 $Proxy0 这东西,我们看到,这个东西是由 System.out.println(subject.getClass().getName()); 这条语句打印出来的,那么为什么我们返回的这个代理对象的类名是这样的呢?

通过 Proxy.newProxyInstance 创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运 行是动态生

成的一个对象,并且命名方式都是这样的形式,以$开头,proxy为中,最后一个数字表示对象的标号。

浅谈-Java设计模式之动态代理

标签:

原文地址:http://www.cnblogs.com/ant-world/p/5422221.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!