Java基础之-代理
来源:互联网 发布:网络接口转换器怎么用 编辑:程序博客网 时间:2024/05/17 00:03
0.代理
代理是基本的设计模式之一,是为了提供额外或者不同的操作,而插入的用来代替“实际”对象的操作,代理通常充斥着中间人的角色。
java中的代码分为静态代理和动态代理。
1.静态代理
代理类在程序运行之前就存在叫静态代理,我们来举个例子。
生命一个接口action。
public interface Action { void work(); void sleep();}
实现该接口的实际类
public class RealObjet implements Action { @Override public void work() { System.err.println("realobject work"); } @Override public void sleep() { System.err.println("realobject sleep"); }}
代理类也需要实现那个接口,并且在静态代理中,需要我们将实际的实现类,传入进去。
public class ProxyObject implements Action { RealObjet realObjet; public ProxyObject(RealObjet realObjet){ this.realObjet = realObjet; } @Override public void work() { realObjet.work(); } @Override public void sleep() { realObjet.sleep(); }}
最后测试。
RealObjet realObjet = new RealObjet(); ProxyObject proxy = new ProxyObject(realObjet); proxy.work(); proxy.sleep();
来看下输出结果,这就是一个非常简单的静态代理的例子。
2.动态代理
代理类在运行之前是不存在的,运行过程中由程序动态生成的叫动态代理。实现动态代理的步奏如下。
- 新建委托类(真正的实现类)
- 实现InvocationHandler接口,负责链接代理类和委托类
- 通过Proxy类新建代理类对象
这里的委托类我们还用上面的RealObject。我们看下InvocationHandler接口的实现。
public class RealInvocationHandler implements InvocationHandler { private Object object; public RealInvocationHandler(Object object){ this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object object = (Action) method.invoke(this.object,args); System.err.println("invoke:"+ method.getName()); return object; }}
这里需要注意几个地方。
- 这里所有的地方都需要用Object
好,我们看下最后一步的实现。
RealInvocationHandler invocationHandler = new RealInvocationHandler(new RealObject()); Action action = (Action) Proxy.newProxyInstance(Action.class.getClassLoader(),new Class[]{Action.class}, invocationHandler); action.work(); action.sleep();
细心的同学会发现,在上面,我们使用的是委托类实现的接口Action,这里一定要注意,构造InvocationHandler的时候,使用委托类,而在其他地方,一定要用委托类的接口,一定要注意。
3. 作用 是什么
从上面我们可以知道,通过代理我们能在方法执行前后做一些操作,好吧,我编不下去了。详情请看。
Java 动态代理作用是什么?
0 3
- Java基础之-代理
- Java基础之代理模式
- java基础之动态代理
- Java基础之代理Proxy
- java之架构基础-动态代理&cglib
- Java基础加强之动态代理
- 【java-之路】学习动态代理[基础]
- 第一章 Java基础之JDK动态代理
- java之架构基础-动态代理&cglib
- java之架构基础-动态代理&cglib
- Spring AOP 之 java 动态代理基础
- java基础之静态代理和动态代理
- 基础加强之代理
- 基础加强之代理
- 代理模式之基础
- 【Java基础】代理 - Proxy
- Java基础---Proxy 代理
- 10.Java 基础 - 代理
- CSS选择器【上】
- 【翻译】Java面向对象编程基本概念——封装
- 相位恢复算法(Phase Retrieval)
- C语言的按位与、或、非、异或
- nodejs调用c++dll感想
- Java基础之-代理
- C++ 流控制函数setw()、setfill()、setbase()、setprecision()的使用
- Light OJ 1027 - A Dangerous Maze(求期望)
- xcode编译错误'../lib/DropboxSDK.framework/DropboxSDK' does not contain bitcode.
- Android通用base适配器使用教程(一)
- Android权限设置大全
- 【翻译】Java面向对象编程基本概念——抽象
- Cmake的一个例子
- POJ 1797 最大运载量