Java代理总结
一,几个名词:
1.静态代理
要求:代理对象和被代理对象(目标对象)都要同时实现相同的接口或继承相同的父类。即没有这个前提条件是没法实现静态代理的。
2.动态代理
动态代理又分:
Java JDK: Proxy 代理(又叫接口代理)
要求:目标类必须实现接口或继承父类,代理则不需要。
CGLIB代理:子类代理
要求:目标方法无需实现接口或类。
二.代码(动态代理)
1.Java JDK代理(Proxy 代理)
接口:
public interface IUser {
public void sayHello();
}
实现类(目标类):
public class User implements IUser {
@Override
public void sayHello() {
System.out.println("User sayHello()");
}
}
代理类:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance() {
// JDK Proxy静态方法static Object newProxyInstance(ClassLoader loader,
// Class<?>[] interfaces,InvocationHandler h );实现动态JDK代理
/**
* newProxyInstance()方法有三个参数: ClassLoader loader:获取目标对象的类加载器 Class<?>[]
* interfaces:以泛型的方式拿到目标对象实现的接口类型 InvocationHandler
* h:目标对象执行方法得到加强,目标对象的方法会被以参数的形式传入
*/
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), new InvocationHandler() {
// InvocationHandler对象中的invoke方法
/**
* invoke方法的三个参数:
* Object proxy:代理对象本身
* Method method:目标对象方法
* Object[] args: 方法的参数
*
*/
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
System.out.println("proxy:" + proxy.getClass());
System.out.println("功能增强1.。。。。");
Object returnValue = method.invoke(target, args);
System.out.println("功能增强2.。。。。");
return returnValue;
}
});
}
}
测试类:
public class ProxyTest {
public static void main(String[] args) {
IUser target = new User();
System.out.println("User对象:" + target.getClass());
//代理实现User
IUser proxy = (IUser) new ProxyFactory(target).getProxyInstance();
System.out.println("代理实现User对象:" + proxy.getClass());
//运行方法,执行增强的代理对象
proxy.sayHello();;
}
}
输出:
从圈出部分可以看出invoke(Object Proxy,..)方法中的Proxy为代理对象本身