Java动态代理--动态类proxy的使用

1.什么是动态代理?java

动态代理能够提供对另外一个对象的访问,同时隐藏实际对象的具体事实。代理通常会实现它所表示的实际对象的接口。代理能够访问实际对象,可是延迟实际对象的部分功能,实际对象实现系统的实际功能,代理对象客户隐藏实际对象。客户不知道它是与代理打交道仍是与实际对象打交道。数组

用户-----------------------------------实际对象测试

用户---------动态代理(中介)--------实际对象this

2.为何使用动态代理?spa

动态代理能够对请求进行任何处理.net

3.使用它的好处?代理

动态代理能够对请求进行任何处理对象

4.哪些地方须要动态代理?接口

不容许直接访问某些类,对访问要作特殊处理等开发

目前Java开发包中包含了对动态代理的支持, 可是其实现只支持对接口的的实现。 其实现主要经过java.lang.reflect.Proxy类和
java.lang.reflect.InvocationHandler接口。

Proxy类主要用来获取动态代理对象, InvocationHandler接口用来约束调用者实现
如下为模拟案例, 经过动态代理实如今方法调用先后向控制台输出两句字符串

package com.test.proxy;
/**
 * 定义一个HelloProxy接口
 * @author anlve
 *
 */
public interface HelloProxy {

    public void sayHelloProxy();
    
}

 

package com.test.proxy;
/**
 * 接口实现类HelloProxyImpl
 * @author anlve
 *
 */
public class HelloProxyImpl implements HelloProxy{

    public void sayHelloProxy() {
        System.out.println("Hello Proxy");
    }

}

package com.test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * HelloProxyHandler实现InvocationHandler
 * @author anlve
 * 实如今方法调用先后   向控制台输出两句字符串
 */
public class HelloProxyHandler implements InvocationHandler {

    //要代理的原始对象
    private Object obj;
    
    public HelloProxyHandler(Object obj){
        super();
        this.obj = obj;
    }
    
    /**
     * 在代理实例上处理方法调用并返回结果
     *
     * @param proxy 代理类
     * @param method 被代理的方法
     * @param args 该方法的参数数组
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object result = null;
        //调用以前
        doBefore();
        //调用原始对象的方法
        result = method.invoke(obj, args);
        //调用以后
        doAfter();
        return result;
    }

    private void doAfter() {
        System.out.println("after method invoke");
    }

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

}

package com.test.proxy;

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

/**
 * 测试类
 * @author anlve
 *
 */
public class HelloProxyTest {

    public static void main(String[] args) {
        HelloProxy helloProxy = new HelloProxyImpl();
        InvocationHandler handler = new HelloProxyHandler(helloProxy);
        //建立动态代理对象
        HelloProxy proxy = (HelloProxy) Proxy.newProxyInstance(
                helloProxy.getClass().getClassLoader(), 
                helloProxy.getClass().getInterfaces(),
                handler);
        proxy.sayHelloProxy();
    }
    
}
 

控制台

相关文章
相关标签/搜索