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();
}
}
控制台