Java Proxy 是基于接口实现动态代理,虽然具有一定局限性,但是不得不说Proxy仍然是非常伟大、优秀的.代理模式的应用相当广泛,开源架构Spring AOP 就是基于Java Prxoy 实现的. OK! 废话不多说了.接下来我们以几个实例来看一下Proxy到底如何应用,也会看一下SUN如何实现的Proxy.
Java API:
构造方法摘要 | |
---|---|
protected | Proxy(InvocationHandler h) 使用其调用处理程序的指定值从子类(通常为动态代理类)构建新的 Proxy 实例。 |
方法摘要 | |
---|---|
static InvocationHandler | getInvocationHandler(Object proxy) 返回指定代理实例的调用处理程序。 |
static Class<?> | getProxyClass(ClassLoader loader,Class<?>... interfaces) 返回代理类的 java.lang.Class 对象,并向其提供类加载器和接口数组。 |
static boolean | isProxyClass(Class<?> cl) 当且仅当指定的类通过 getProxyClass 方法或 newProxyInstance 方法动态生成为代理类时,返回 true。 |
static Object | newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。 |
package com.haian.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author Lixh
*
*/
public class SecurityHandler implements InvocationHandler {
// 需要代理的目标对象
public Object targeObject = null;
// 生成代理类
public Object createProxyInstance(Object targeObject) {
this.targeObject = targeObject;
return Proxy.newProxyInstance(SecurityHandler.class.getClassLoader(),
targeObject.getClass().getInterfaces(), this);
}
public Object invoke(Object arg0, Method method, Object[] arrays)
throws Throwable {
return method.invoke(targeObject, arrays);
}
public void validate() {
}
}