一句话说清楚动态代理

一句话 说清楚动态代理  动态的在内存中给被代理对象 创建一个代理类。被代理类不同,创建的代理类不同。所以是动态的

代码实例如下:

工厂类:
public class ProxyFactory {

//维护一个 被代理类 对象 用 Object 就可以了因为不知道 被代理类是那样的。 通过 构造器 初始化 属性
private Object target;
// 利用构造器对 代理对象 进行初始化
public ProxyFactory(Object target) {
this.target = target;
}


//给目标对象生成一个代理对象

/**三个参数的说明:
* classLoder 代理类使用的类加载器和 被代理类使用的是一样的 加载器
* interfaces[] 和被代理类实现了共同的接口
* handler 调用处理器 实现了 InvocationHandler 这个接口的匿名实现类。重写方法
* 这个方法里面利用反射 调用 被代理类的方法。
*
*
*/
public Object getProxyInstance(){
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK代理开始了");
Object val = method.invoke(target,args);
return val;
}
});
}


接口:
    public interface ITeachDao {
void teach();
}



被代理对象:
public class Teacher implements ITeachDao {
public void teach() {
System.out.println("老师正在授课");
}
}

测试 客户端:

//一句话 说清楚动态代理  动态的在内存中给被代理对象 创建一个代理类。被代理对象不同创建的 代理类不同。
public class Client {
public static void main(String[] args) {
//创建 被代理类
Teacher target = new Teacher();
//给被代理类 创建 代理对象
ProxyFactory factory = new ProxyFactory(target);
ITeachDao proxyInstance =(ITeachDao) factory.getProxyInstance();
System.out.println("proxyInstance=" + proxyInstance.getClass());
//代理对象 调用 方法。
proxyInstance.teach();
}
}
 





猜你喜欢

转载自www.cnblogs.com/gaohq/p/11937182.html