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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈-Java设计模式之动态代理相关的知识,希望对你有一定的参考价值。

动态代理模式(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设计模式之动态代理的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模式-代理模式之动态代理(附源代码分析)

浅谈java中内置的观察者模式与动态代理的实现

浅谈JAVA设计模式

#yyds干货盘点# 设计模式之代理模式:动态代理

Java动态代理之通俗理解

浅谈设计模式之代理模式(proxy)