java 代理
来源:互联网 发布:淘宝航模电池套装包邮 编辑:程序博客网 时间:2024/06/17 12:28
1、代理模式
为其他对象提供代理以控制这个对象的访问。
特点:代理对象和被代理对象都实现同一接口,代理对象可以为被代理对象的行为添加额外的动作(预处理消息、过滤消息、事后处理等)。
按照代理的创建时期,分两类:
静态代理:在运行前,代码已编译成class文件。
动态代理:在运行时,通过反射机制动态创建。
2、静态代理示例
接口:
package proxy;public interface Count {void count();void print();}
实现类:
package proxy;public class CountImpl implements Count{public void count() {System.out.print(this.getClass().getName()+" 执行count计数!");}public void print() {System.out.println(this.getClass().getName()+" 显示结果!");}}
代理类:
package proxy;public class ProxyCount implements Count{private Count count;public ProxyCount(Count count){this.count = count;}public void count() {System.out.println("找人代计数开始:");count.count();System.out.println("找人代计数结束!");}public void print() {System.out.println("包装显示开始:");count.print();System.out.println("包装显示结束!");}}
3、java动态代理示例
和动态代理相关的两个java类:
InvocationHandler类:
package java.lang.reflect;public interface InvocationHandler{ public Object invoke(Object object, Method method, Object[] objects)throws Throwable;}
第一个参数object:指被代理的对象;第二个参数method:要调用的方法;第三个参数objects:方法调用所需要的参数。
Proxy类:
public static Object newProxyInstance(ClassLoader classloader, Class[] var_classes, InvocationHandler invocationhandler)
// 用于关联代理对象
示例:
package proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class DynaProxyCount implements InvocationHandler{private Object object;public DynaProxyCount(Object object){this.object = object;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {before();Object result = method.invoke(this.object, args);after();return result;}private void before(){System.out.println("调用方法之前执行!");}private void after(){System.out.println("调用方法之后执行!");}}
测试类:
package proxy;import java.lang.reflect.Proxy;public class TestDynaProxy {/** * @param args */public static void main(String[] args) {// TODO 自动生成方法存根Count count = new CountImpl();DynaProxyCount handler = new DynaProxyCount(count);Count proxy = (Count)Proxy.newProxyInstance(count.getClass().getClassLoader(),count.getClass().getInterfaces(),handler);proxy.count();proxy.print();}}
4、cglib动态代理示例
jdk动态代理只提供了接口的代理,没有针对类的代理。cglib动态代理的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
示例:
package proxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxyCount implements MethodInterceptor{private Object object;public Object getInstance(Object obj){this.object = obj;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.object.getClass());// 回调enhancer.setCallback(this);return enhancer.create();}public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {before();Object result = proxy.invokeSuper(obj, args);after();return result;}private void before(){System.out.println("调用方法之前执行!");}private void after(){System.out.println("调用方法之后执行!");}}
测试类:
package proxy;public class TestCglibProxy {public static void main(String[] args){CglibProxyCount proxy = new CglibProxyCount();Count count = (Count)proxy.getInstance(new CountImpl());count.count();count.print();}}
0 0
- Java 代理,动态代理
- java代理静态代理
- Java代理
- java代理
- java代理
- java 代理
- java代理
- JAVA 代理
- Java----代理
- java代理
- java代理
- java代理
- java代理
- java 代理
- java 代理
- java代理
- java代理
- Java----代理
- Regularized logistic regression
- JAVA5线程池使用
- Mocks Aren't Stubs
- 查看LINUX版本命令
- java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式详解与比较(二)
- java 代理
- 轻松编写 C++ 单元测试 介绍全新单元测试框架组合: googletest 与 googlemock
- 用java代码构建一个线程池
- 最新颖的广州传智播客PHP课程吸引众多学员
- IGMP技术介绍
- 创建临时表
- openstack taskflow
- android开发教程(十三)——JAVA基础之理解JNI原理(java调用C语言接口)
- Java注解之Annotation详解