动态代理
动态代理模式与策略模式的区别
1、策略模式:在项目中适用于 实现同一个目标但是有很多不同的做法的情况,
比如实现数据库里面的搜索,可能算法、方式很多,但是目的差不多。这时候可以使用策略模式
2、代理模式:主要针对对象的访问控制,比如在hibernate的懒加载中,不希望页面直接访问dao层的数据。
这时候给页面开放一个Proxy。
例子:
1、首先定义个接口
public interface Subject {
public String init();
}
2、实现接口的实现类
--------------------------第一个实现类-----------------------------------------------
public class RealOneSubject implements Subject {
private String id= "127.0.0.1";
public String init() {
return id;
}
}
--------------------------第二个实现类-----------------------------------------------
public class RealTwoSubject implements Subject{
private String id = "18518175440";
@Override
public String init() {
// TODO Auto-generated method stub
return id;
}
}
3、创建一个动态代理类,实现InvocationHandler接口,并重写该invoke方法
public class DynamicProxy implements InvocationHandler{
private Object object;
public DynamicProxy(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object result = method.invoke(object, args);
return result;
}
}
4、客服端测试
import java.lang.reflect.Proxy;
public class test {
public static void main(String[] args) {
Subject one = new RealOneSubject();
Subject two = new RealTwoSubject();
//执行RealOneSubject实现类中的方法
DynamicProxy proxy = new DynamicProxy(one);
ClassLoader classLoader = one.getClass().getClassLoader();
Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, proxy);
String init = subject.init();
System.out.println("执行RealOneSubject实现类中的方法---"+init);
//执行RealTwoSubject实现类中的方法
DynamicProxy proxy1 = new DynamicProxy(two);
ClassLoader classLoader1 = two.getClass().getClassLoader();
Subject subject1 = (Subject) Proxy.newProxyInstance(classLoader1, new Class[]{Subject.class}, proxy1);
String init1 = subject1.init();
System.out.println("执行RealTwoSubject实现类中的方法---"+init1);
}
}
效果:

|