JAVA代理,静态,动态详解( 二 )


缺点:
出现了大量的代码重复 。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法 。增加了代码维护的复杂度 。
代理对象只服务于一种类型的对象,如果要服务多类型的对象 。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了 。
动态代理
JDK动态代理
Jdk动态代理,针对的是实现接口的类;
要求目标对象必须实现接口,因为它创建代理对象的时候是根据接口创建的 。被代理对象可以可以实现多个接口,创建代理时指定创建某个接口的代理对象就可以调用该接口定义的方法了 。
需要java.lang.reflect.InvocationHandler接口和 java.lang.reflect.Proxy 类的支持
//Object proxy:被代理的对象
//Method method:要调用的方法
//Object[] args:方法调用时所需要参数
ublic interface InvocationHandler {
ublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
//CLassLoader loader:类的加载器
//Class<?> interfaces:得到全部的接口
//InvocationHandler h:得到InvocationHandler接口的子类的实例
ublic static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
代码实现
ameDao 姓名-接口(Subject)
ublic interface NameDao {
ublic boolean addName(String name);
}
AgeDao 年龄-接口(Subject)
ublic interface AgeDao {
ublic boolean addAge(Integer age);
}
ameAndAgeDaoImpl 姓名、年龄实现类(RealSubject)
ublic class NameAndAgeDaoImpl implements NameDao,AgeDao {
[email protected]
ublic boolean addName(String name) {
ystem.out.println("NameDaoImpl——>" + name);
return true;
}
[email protected]
ublic boolean addAge(Integer age) {
ystem.out.println("AgeDaoImpl——>" + age);
return true;
}
}
MyInvocationHandler,对接口提供的方法进行增强(Proxy)
ublic class MyInvocationHandler implements InvocationHandler {
rivate Object target;
ublic MyInvocationHandler(Object target) {
this.target = target;
}
[email protected]
ublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ystem.out.println("——-before——-");
ystem.out.println("Proxy=" + proxy.getClass());
ystem.out.println("method=" + method);
ystem.out.println("args=" + Arrays.toString(args));
//执行目标方法对象
Object result = method.invoke(target, args);
ystem.out.println("——-after——-");
return result;
}
}
roxyFactory 代理工厂
ublic class ProxyFactory {
ublic static Object getProxy(Object proxyObj) {
/**
* loader 指定加载jvm运行时动态生成的代理对象的加载器
* interface 真实对象实现的所有接口