Java代理
来源:互联网 发布:淘宝这那样下架商品 编辑:程序博客网 时间:2024/06/05 13:27
简单介绍三种代理方式,如果有不清楚的地方可以+QQ:3393055725
Java三种代理方式:静态代理,动态代理(JDK代理),cglib代理
1、静态代理:
静态代理的实现方式很简单,但是用到的不多,静态代理和动态代理使用的前提都是目标对象要实现接口,每个目标对象都要对应一个代理类
//目标对象接口public interface ITarget { void fun();}//目标对象public class Target implements ITarget { @Override public void fun() { System.out.println("调用目标对象方法"); }}//代理类public class StaticProxy implements ITarget {//实现和目标对象相同的接口 private ITarget target;//目标对象 //通过构造函数创建代理对象 public StaticProxy(ITarget target) {//传参:接口对象 this.target = target; } @Override public void fun() { System.out.println("静态代理开始"); target.fun(); System.out.println("静态代理结束"); }}//测试类public class Test { public static void main(String[] args) { //目标对象 ITarget target = new Target(); ITarget proxy = new StaticProxy(target); proxy.fun(); }}
2、动态代理
动态代理用到的更多一些,但是目标对象要实现接口,因为动态代理的实现需要传入接口类型, 不需要每个目标对象都对应一个代理类
//省略目标对象的接口和实现类//...参考静态代理//动态代理类public class DynamicProxy { //目标对象 private Object target; public DynamicProxy (Object target) { this.target = target; } //生成代理对象 public Object getProxy() { return Proxy.newProxyInstance(//三个参数 target.getClass().getClassLoader(),//类加载器 target.getClass().getInterfaces(),//目标对象接口类 new InvocationHandler(){//事件处理器 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("动态代理开始"); Object returnValue = method.invoke(target, args); System.out.println("动态代理结束"); return returnValue; } }); }}//测试类public class Test { ITarget target = new Target(); ITarget proxy = (ITarget) new DynamicProxy(ITarget target).getProxy(); proxy.fun(); }
3、cglib代理
cglib代理不需要目标对象实现接口,所以当目标对象没有实现接口的前提下可以使用cglib代理,使用cglib代理要引入jar包,在web工程中spring-core.jar文件中包含cglib代理文件
实现原理是为目标对象创建子类对象
// 省略目标对象类,参考静态代理实现类,但是不实现接口即可// 实现cglib代理public class CgligProxy implements MethodInterceptor{//实现MethodInterceptor接口 // 目标对象 private Object target; public CglibProxy(Object target) { this.target = target; } // 为目标对象创建代理对象 public Object getProxy(){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.serCallback(this); return enhancer.create(); } // 重写拦截方法 @Override public Object intercept(Object obj, Method method, Objects[] orgs, MethodProxy proxy) throw Throwable { System.out.println("cglib代理开始"); Object returnValue = method.invoke(target, orgs); System.out.println("cglib代理结束"); return returnValue; }}// 测试类public class Test{ // 目标对象 Target target = new Target();//这里的不是接口对象,是类对象 // 代理对象 Target proxy = (Target) new ProxyFactory(target).getProxy(); proxy.fun();}
阅读全文
1 0
- Java 代理,动态代理
- java代理静态代理
- Java代理
- java代理
- java代理
- java 代理
- java代理
- JAVA 代理
- Java----代理
- java代理
- java代理
- java代理
- java代理
- java 代理
- java 代理
- java代理
- java代理
- Java----代理
- 学生管理系统IO版
- networking常用命令
- 为laravel5.1生产环境linux从源代码安装PHP
- Android 4.4 Graphic 图形架构
- 我的第一篇博客
- Java代理
- 类模板以及其中的traits技术和type classification技术
- poi导入Excel,兼容03/07版本
- laravel下的团队开发
- laravel重要概念和知识点
- PHP的模板引擎这点事儿
- Hadoop 资源调度架构和实现
- laravel, Composer和autoloading
- struts2前台后台逻辑串联