代理有很多种表现形式,在Java中可以使用代理将代码分离,把与业务逻辑无关的,但又需要重复使用的代码独立出来,而后通过代理把它注入到业务中,就可以达到代码的重用性和灵活性。
下面举一个简单的日志例子:
1.建立一个接口:
public interface WorkIf {
public void doWork(String name);
}
2.建立两个实现类:
public class WorkImpl implements WorkIf {
public void doWork(String name) {
System.out.println(name + " 正在工作w1");
}
}
public class WorkImpl2 implements WorkIf {
public void doWork(String name) {
System.out.println(name + " 正在工作w2");
}
}
3.建立一个日志类,其中写的就是需要注入的日志内容:
public class LogClass {
public static void before(){
System.out.println(" 开始写日志");
}
public static void after(){
System.out.println(" 日志记录完成");
}
}
4.下面就是最重要的代理类:
public class DPrxoy implements InvocationHandler{
private Object delegate;
//返回一个指定接口的代理类实例
public Object bind(Object delegate){
this.delegate = delegate;
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
}
//代理时自动调用的方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
LogClass.before();
result = method.invoke(delegate, args[0]);
LogClass.after();
return result;
}
}
5.下面是一个测试类:
public class Test {
public static void main(String[] args) {
DPrxoy proxy = new DPrxoy();
WorkIf w1 = (WorkIf)proxy.bind(new WorkImpl());
w1.doWork("admin");
WorkIf w2 = (WorkIf)proxy.bind(new WorkImpl2());
w2.doWork("administrator");
}
}
在整个流程中都由代理来控制,当我们调用代理的bind方法是,就会返回一个相应的代理类实例,而用这个实例就可以调用相应类的方法。这其中我们可以方便地切换类实例,也就是切换了不同的实现类。而由于在执行代理时会自动执行invoke方法,在invoke方法中又调用了日志类的方法,所以也就相当于在业务逻辑中调用了记录日志的方法。这个过程是由代理来完成的,代理自动把记录日志的功能注入到业务逻辑中,在业务逻辑中不需要关心日志部分的实现,所以无论有多少实现类都可以使用这一个代理。这些实现类都获得了记录日志的功能,但是它们并没有直接去调用日志类的方法,而是通过代理来替他们实现,这就是代码的分离、代码的重用,而且灵活性很好。
在java中很多地方都可以使用代理,spring框架的ioc就是一个很好的例子。
分享到:
相关推荐
java动态代理实例 要想理解拦截器的知识 最好要先理解java动态代理这块
java动态代理 public class HireProxy implements InvocationHandler { //被代理的真实角色 private Object obj; public HireProxy(Object obj) { super(); this.obj = obj; } //第二个参数method,被...
Java 动态代理详解(学习资料);Java 动态代理详解(学习资料);Java 动态代理详解(学习资料);Java 动态代理详解(学习资料);Java 动态代理详解(学习资料);
适用于初探java动态代理模式,精简易懂。
对代理模式与Java动态代理类的理解说明
java 动态代理 简单实例 新手看看
Java动态代理的helloworld,抛砖引玉吧
描述java动态代理,说明了怎么实现java的动态代理
Java 动态代理 借用电子商务模式来说明
更好的了解java动态代理的原理!
java动态代理 经典文章(word 2007格式的) 要用word 2007看
一个简单的java动态代理的实例
用Java动态代理实现AOP,讲的很好(用Java动态代理实现AOP)
Java动态代理实现数据源连接池,用代理类实现的连接池代码,绝对完整的案例,下载源码就能跑起来!Java动态代理实现数据源连接池,用代理类实现的连接池代码
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: (1) Interface InvocationHandler (2) Proxy:该类即为动态代理类,
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: (1) Interface InvocationHandler (2) Proxy:该类即为动态代理类,
java动态代理项目实践优化(3)
Java实现动态代理的两种方式。 相对来说cglib更加方便。可以实现为实现接口的类(非final类)
java动态代理 完整版 java动态代理 完整版 java动态代理 完整版 java动态代理 完整版 java动态代理 完整版
java动态代理的机制分析,以及相应的拓展。有详细的代码和实例加以分析。