java代理的深入浅出(一)-Proxy】的更多相关文章

java代理的深入浅出(一)-Proxy 1.什么是代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理: 由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,…
java代理的深入浅出(二)-CGLIB 1.基本原理 CGLIB的原理就是生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法.在子类中拦截所有父类方法的调用,拦截下来交给设置的MethodInterceptor去执行. 由于是采用继承来实现的代理,所以不能对final修饰的类进行代理,其它都可以代理. 子类的生成它采用了非常底层的字节码技术(ASM节码处理框架),转换字节码来完成.它要求必须对JVM内部结构包括class文件的格式和指令集都很熟悉. 代理一个类一般会动态生成三…
简介 类似字节码操作方法还有ASM.几种动态编程方法相比较,在性能上Javassist高于反射,但低于ASM,因为Javassist增加了一层抽象.在实现成本上Javassist和反射都很低,而ASM由于直接操作字节码,相比Javassist源码级别的api实现成本高很多.几个方法有自己的应用场景,比如Kryo使用的是ASM,追求性能的最大化.而NBeanCopyUtil采用的是Javassist,在对象拷贝的性能上也已经明显高于其他的库,并保持高易用性.实际项目中推荐先用Javassist实现…
java 动态代理范例 InvocationHandler与Proxy,拦截与代理 java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序(详见api文档) java.lang.reflect.InvocationHandler,InvocationHandler 是代理实例的调用处理程序 实现的接口.invoke()在代理实例上处理方法调用…
代码如下: final Connection conn=pool.remove(0); //利用动态代理改造close方法 Connection proxy= (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object pro…
浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及InvocationHandler便可为目标接口生成代理类及代理对象. // 方法 1: 该方法用于获取指定代理对象所关联的InvocationHandler static InvocationHandler getInvocationHandler(Object proxy) // 方法 2:该方法用于…
使用browsermob代理做埋点数据,maven配置的包如下 <dependency> <groupId>net.lightbody.bmp</groupId> <artifactId>browsermob-core</artifactId> <version>2.1.4</version> </dependency> 在其他同事电脑上,可能会正常运行,但是在我自己电脑上不能正常运行,提示错误如下 java.…
java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***问题解决方案 临床表现: 病例: 定义代理类: @Transactional @Repository public UserDaoImpl implements UserDao extends BaseDaoImpl{ /*没有实现任何接口*/ } 获取代理类: ApplicationContext ctx = new ClassPathXmlAppli…
代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代.代理类负责请求的预处理.过滤.将请求分派给委托类处理.以及委托类执行完请求后的后续处理. 下面以明星为例模拟需求说明静态代理和动态代理. 一.首先看静态代理 看下图:歌迷希望明星许巍唱歌(许巍即是目标对象),但不可能直接找…
一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 /** * 业务接口 * @author pc * */ public interface UserService { // 增加一个用户 public void addUser(); // 编辑账户 public void editUser(); } 2.业务实现类 /** * 业务实现类 * @author pc…
一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 1 2 3 4 5 6 7 8 9 10 11 12 13 /**  * 业务接口  * @author pc  *  */ public interface UserService {           // 增加一个用户     public void addUser();     // 编辑账户     pu…
java.lang.ClassCastException: com.sun.proxy.$Proxy32 cannot be cast to com.bkc.bpmp.core.cache.MemcachedManager at com.bkc.bpmp.common.utils.CacheUtils.<clinit>(CacheUtils.java:11) at com.bkc.bpmp.modules.sys.controller.MainController.showCache(Main…
java代理模式及动态代理类 1.      代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及到的角色有: 抽象角色:声明真实对象和代理对象的共同接口: 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相…
代理模式: 代理模式的作用:为其他对象提供一种代理以控制对 特定对象  的访问. 某种情况下,一个客户不想或者直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用:通过代理对象引用. 代理模式一般涉及到的角色: 抽象角色:声明真实对象和代理对象的共同接口.可以是一个抽象类或者一个接口. 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便任何时候都能代替真实对象. 同时,代理对象可以在执行真实对象操作时,附加其他的操作,…
Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public interface Greeting { public void doGreet(); } 实现类: public class SayHello implements Greeting { @Override public void doGreet() { System.out.println("…
阅读这篇文章之前,请先阅读 Java-HTTP连接时如何使用代理(一)——System.Property方式 除了使用 System.setProperty() 的方式之外,还可使用 Proxy 的方式. /* * PROXY_HOST:代理的IP地址 * PROXY_PORT_INT:代理的端口号 */ Proxy proxy=newProxy(Proxy.Type.HTTP, newInetSocketAddress(PROXY_HOST, PROXY_PORT_INT)); URL url…
这里使用google的Gson包做JSON转换,因为较早的1.4版本的FieldAttributes类中没有getDeclaringClass()这个方法,这个方法是获取field所属的类,在我的排除策略中会用到. 排除策略   最简单的gson转换可以是这样的,但却没有多少实际的作用.切面日志时,一个实体和其他实体存在关联,这时候就需要通过自定义排除策略决定如何转换关联对象,否则可能出现“爆炸式”的json字符串. Gson gson = new Gson(); int[] ints = {1…
Java的代理模式是应用非常广泛的设计模式之一,也叫作委托模式,其目的就是为其他的对象提供一个代理以控制对某个对象的访问和使用,代理类负责为委托类预处理消息,过滤消息并转发消息,以及对消息执行后续处理. 代理就是充当一个中间人的角色. 按照代理的创建时期,代理类可以分为两种: 静态代理:指由程序员直接创建生成源代码,在对其编译生成.class文件,在程序运行之前就已经存在 动态代理:在程序运行时,使用java的反射机制动态创建而成.其中动态代理又分为JDK代理(需要接口)和cglib代理(不需要…
异常: Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to com.pro.service.impl.UserServiceImpl at com.pro.test.TestSpring.main(TestSpring.java:12) 一.抛异常的工程 定义Service层接口 package com.pro.service; /** * 用户…
JAVA代理相关主要知识如下: (1)利用代理可以在运行时创建一个实现了一组给定接口的新类.         这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. (2)假设有一个表示接口的Class对象,它的确切类型在编译时无法知道.         要想构建一个实现接口的类,就需要使用NewInstance方法或反射找出这个类的构造器.         但是不能实例化一个接口,需要在程序处于运行状态时定义一个新类. (3)为解决这个问题,有些程序将会生成代码,将这些代码放置在一个文件…
1         代理 1.1            代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象,代理类提供方法给外部调用,代理类内部再去调用实现类的方法,实现具体的业务.也就是代理类作为对外接口人,实现类不直接对外.这就是java代理的概念. 代理的作用是当你需要增加一些而外的操作,而又不想去修改实现类的.可以通过代理来实现,在代理类中增加附件的操作.例如需要增加权限过滤,但是业务类已经开发好…
当我们使用gson 转对象时,并且这个对象中有一些属性是懒加载时如 @Entity @Table(name = "user") public class User { @Id @Column(columnDefinition="varchar(255)") @GeneratedValue(generator="idGenerator") @GenericGenerator(name="idGenerator", strateg…
熟悉设计模式的人对于代理模式可能都不陌生.那什么事代理呢,例如我们要买一件国外的商品,但是自己买不到只能去找代购,这个代购就是我们的代理.我们来了解下java中的代理 静态代理 我们来举一个开车的例子, 首先定义一辆车 再新建一个具体实现类 这个时候启动汽车 输出 汽车发动 这个时候我们想在汽车发动前系上安全带,汽车发动后开始加速 我们可以这么写 这个时候我们再启动汽车 输出: 系安全带 汽车发动 加速前进 这里的CarProxy就是CarImpl的代理,CarImpl委托CarProxy实现启…
这个异常是在开发Spring案例时遇到的. 贴一下完整异常信息: Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy4 cannot be cast to com.edu.aop.ArithmeticCalculatorImpl at com.edu.aop.Main.main(Main.java:11) 原因:Spring AOP是实现AOP的一种技术,是采用“动态代理技术”实现的…
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 代理模式最大的特点就是代理类和实际业务类实现同一个接口(或继承同一父类),代理对象持有一个实际对象的引用,外部调用时操作的是代理对象,而在代理对象的内部实现中又会去调…
1 严重: Servlet /N002-1.0 threw load() exception 2 java.lang.ClassCastException: com.sun.proxy.$Proxy27 cannot be cast to com.bbk.n002.service.QuestionService 3 at com.bbk.n002.servlet.CreateTaskQueueServlet.init(CreateTaskQueueServlet.java:28) 4 at ja…
本博文中项目代码已开源下载地址:GitHub Java代理和动态代理机制分析和应用 概述 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理.根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种. 代理模式一般涉及到的角色有4种 主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法: 真实主题:真正实现业务逻辑的类: 代理类:用来代理和封装真实主题:…
都知道Java中的Spring,有一重要思想:AOP,实现原理也就是Java的动态代理机制.初见代理这个名词时,觉得生活中常有代理的这一说法. 那么,在Java中,代理又是什么呢?它又是如何实现的?实现后是干什么的? 其实啊,Java中的代理也就是生活中代理的意思,我认为,在Java中,代理就是帮助类实现一些修改的动作. 也就是说,用代理类来修改已经存在的类.那么,问题又来了,为何这样做呢?在存在的类上修改不就完事了吗? 首先,这种想法时错的,Java中,已经编译好的类不要随随便便的修改,容易造…
要理解动态代理,需要先理解反射(http://www.cnblogs.com/Donnnnnn/p/7729443.html) 通俗理解: 在很多底层框架中都会用得到,比如struts,Spring等都用到了动态代理,它的作用很简单: 利用反射将你要使用的类,重新生成一个子类或本类,这样框架就可以利用这个新生成的类做一些事情,比如在该类的方法前后加一些代码. 这样的话,你想像一下,你是不是不用修改任何已经编写好的代码,只要使用代理就可以灵活的加入任何东西,将来不喜欢了,不用也不会影响原来的代码.…
浅谈Java代理二:Cglib动态代理-MethodInterceptor CGLib动态代理特点: 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高.唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类. 示例业务逻辑: 1-有一个明星叫胡歌(class HuGe) 3-找明星做事情需要经过助理(ProxyFactory ) 4-…