- 浏览: 5043609 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (2844)
- java (1094)
- hadoop (37)
- jvm (39)
- hbase (11)
- sql (25)
- 异常 (83)
- div css (6)
- 数据库 (95)
- 有趣的code (15)
- struts2 (6)
- spring (124)
- js (44)
- 算法 (65)
- linux (36)
- hibernate (7)
- 中间件 (78)
- 设计模式 (2)
- 架构 (275)
- 操作系统 (91)
- maven (35)
- tapestry (1)
- mybatis (9)
- MQ (101)
- zookeeper (18)
- 搜索引擎,爬虫 (208)
- 分布式计算 (45)
- c# (7)
- 抓包 (28)
- 开源框架 (45)
- 虚拟化 (12)
- mongodb (15)
- 计算机网络 (2)
- 缓存 (97)
- memcached (6)
- 分布式存储 (13)
- scala (5)
- 分词器 (24)
- spark (104)
- 工具 (23)
- netty (5)
- Mahout (6)
- neo4j (6)
- dubbo (36)
- canal (3)
- Hive (10)
- Vert.x (3)
- docker (115)
- 分布式追踪 (2)
- spring boot (5)
- 微服务 (56)
- 淘客 (5)
- mesos (67)
- php (3)
- etcd (2)
- jenkins (4)
- nginx (7)
- 区块链 (1)
- Kubernetes (92)
- 驾照 (1)
- 深度学习 (15)
- JGroups (1)
- 安全 (5)
- 测试 (16)
- 股票 (1)
- Android (2)
- 房产 (1)
- 运维 (6)
- 网关 (3)
最新评论
-
明兜3号:
部署落地+业务迁移 玩转k8s进阶与企业级实践技能(又名:Ku ...
Kubernetes系统常见运维技巧 -
q328965539:
牛掰啊 资料收集的很全面
HDFS小文件处理解决方案总结+facebook(HayStack) + 淘宝(TFS) -
guichou:
fluent挂载了/var/lib/kubelet/pods目 ...
kubernetes上部署Fluentd+Elasticsearch+kibana日志收集系统 -
xu982604405:
System.setProperty("java.r ...
jmx rmi 穿越防火墙问题及jmxmp的替代方案 -
大漠小帆:
麻烦问下,“获取每个Item相似性最高的前N个Item”,这个 ...
协同过滤推荐算法在MapReduce与Spark上实现对比
jdk动态代理类的源码
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; public final class $Proxy0 extends Proxy implements Manager { private static Method m1; private static Method m0; private static Method m3; private static Method m2; static { try { m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") }); m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]); m3 = Class.forName("com.ml.test.Manager").getMethod("modify", new Class[0]); m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]); } catch (NoSuchMethodException nosuchmethodexception) { throw new NoSuchMethodError(nosuchmethodexception.getMessage()); } catch (ClassNotFoundException classnotfoundexception) { throw new NoClassDefFoundError(classnotfoundexception.getMessage()); } } public $Proxy0(InvocationHandler invocationhandler) { super(invocationhandler); } @Override public final boolean equals(Object obj) { try { return ((Boolean) super.h.invoke(this, m1, new Object[] { obj })) .booleanValue(); } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } } @Override public final int hashCode() { try { return ((Integer) super.h.invoke(this, m0, null)).intValue(); } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } } public final void modify() { try { super.h.invoke(this, m3, null); return; } catch (Error e) { } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } } @Override public final String toString() { try { return (String) super.h.invoke(this, m2, null); } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } } }
cglib 动态代理产生的源码
package com.zhang.shine.cache; import java.lang.reflect.Method; import java.util.Map; import net.sf.cglib.core.Signature; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Dispatcher; import net.sf.cglib.proxy.Factory; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.NoOp; import org.springframework.aop.SpringProxy; import org.springframework.aop.framework.Advised; public class Sev$$EnhancerByCGLIB$$e8033e73 extends Sev implements SpringProxy, Advised, Factory { private boolean CGLIB$BOUND; private boolean CGLIB$CONSTRUCTED; private static final ThreadLocal CGLIB$THREAD_CALLBACKS; private static final Callback[] CGLIB$STATIC_CALLBACKS; private MethodInterceptor CGLIB$CALLBACK_0; private MethodInterceptor CGLIB$CALLBACK_1; private NoOp CGLIB$CALLBACK_2; private Dispatcher CGLIB$CALLBACK_3; private Dispatcher CGLIB$CALLBACK_4; private MethodInterceptor CGLIB$CALLBACK_5; private MethodInterceptor CGLIB$CALLBACK_6; private static final Method CGLIB$getSort$0$Method; private static final MethodProxy CGLIB$getSort$0$Proxy; private static final Object[] CGLIB$emptyArgs; private static final Method CGLIB$getSort$1$Method; private static final MethodProxy CGLIB$getSort$1$Proxy; private static final Method CGLIB$hashCode$3$Method; private static final MethodProxy CGLIB$hashCode$3$Proxy; private static final Method CGLIB$clone$4$Method; private static final MethodProxy CGLIB$clone$4$Proxy; private static final Method CGLIB$equals$5$Method; private static final MethodProxy CGLIB$equals$5$Proxy; private static final Method CGLIB$toString$6$Method; private static final MethodProxy CGLIB$toString$6$Proxy; static void CGLIB$STATICHOOK1() { CGLIB$THREAD_CALLBACKS = new ThreadLocal(); Class localClass; CGLIB$emptyArgs = new Object[0]; ClassLoader tmp27_17 = (localClass = Class.forName("com.zhang.shine.cache.Sev$$EnhancerByCGLIB$$e8033e73")).getClassLoader(); CGLIB$getSort$0$Proxy = MethodProxy.create(tmp27_17, (e8033e73.CGLIB$getSort$0$Method = Class.forName("com.zhang.shine.cache.Sev").getDeclaredMethod("getSort", new Class[] { Integer.TYPE, Integer.TYPE })).getDeclaringClass(), localClass, "(II)Ljava/util/Map;", "getSort", "CGLIB$getSort$0"); ClassLoader tmp74_27 = tmp27_17; CGLIB$getSort$1$Proxy = MethodProxy.create(tmp74_27, (e8033e73.CGLIB$getSort$1$Method = Class.forName("com.zhang.shine.cache.Sev").getDeclaredMethod("getSort", new Class[0])).getDeclaringClass(), localClass, "()V", "getSort", "CGLIB$getSort$1"); ClassLoader tmp109_74 = tmp74_27; CGLIB$hashCode$3$Proxy = MethodProxy.create(tmp109_74, (e8033e73.CGLIB$hashCode$3$Method = Class.forName("java.lang.Object").getDeclaredMethod("hashCode", new Class[0])).getDeclaringClass(), localClass, "()I", "hashCode", "CGLIB$hashCode$3"); ClassLoader tmp144_109 = tmp109_74; CGLIB$clone$4$Proxy = MethodProxy.create(tmp144_109, (e8033e73.CGLIB$clone$4$Method = Class.forName("java.lang.Object").getDeclaredMethod("clone", new Class[0])).getDeclaringClass(), localClass, "()Ljava/lang/Object;", "clone", "CGLIB$clone$4"); ClassLoader tmp179_144 = tmp144_109; CGLIB$equals$5$Proxy = MethodProxy.create(tmp179_144, (e8033e73.CGLIB$equals$5$Method = Class.forName("java.lang.Object").getDeclaredMethod("equals", new Class[] { Class.forName("java.lang.Object") })).getDeclaringClass(), localClass, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$5"); CGLIB$toString$6$Proxy = MethodProxy.create(tmp179_144, (e8033e73.CGLIB$toString$6$Method = Class.forName("java.lang.Object").getDeclaredMethod("toString", new Class[0])).getDeclaringClass(), localClass, "()Ljava/lang/String;", "toString", "CGLIB$toString$6"); return; } final Map CGLIB$getSort$0(int paramInt1, int paramInt2) { return super.getSort(paramInt1, paramInt2); }
它们底层都是通过动态产生字节码,动态编译而运行的。
发表评论
-
spring session序列化问题排查
2017-12-01 19:07 6280严重: Servlet.service() for ser ... -
spring mvc统一异常处理(@ControllerAdvice + @ExceptionHandler)
2017-12-01 17:09 3006spring 封装了非常强大的异常处理机制。本文选取@Co ... -
springboot注解
2017-12-01 09:44 1030@RestController和@RequestMappin ... -
Spring 4 xml 注解配置谅解
2017-12-01 09:39 1121《Spring in Action》4th E ... -
利用junit对springMVC的Controller进行测试
2017-11-30 16:26 1451平时对junit测试service/D ... -
spring cloud config实现datasource的热部署
2017-11-21 16:44 1625关于spring cloud config的基本使用,前面的 ... -
Spring+MyBatis实现数据库读写分离方案
2017-11-20 17:15 1097百度关键词:spring mybatis 多数据源 读写分离 ... -
spring session 退出登录 清理session
2017-11-10 09:26 6478/** * Allows creating an ... -
spring http session 监听 创建 失效session
2017-11-15 09:35 4883一.流程概述 主要是通过扩展ServletRequest ... -
spring session spring:session:sessions:expires 源码跟踪
2017-11-14 09:37 1517/** * Saves any attribut ... -
spring session 考虑问题解答
2017-11-09 09:50 658相关问题 2.Redis容量考虑,由于spring see ... -
spring 获取bean 测试
2017-11-09 09:51 677package com.jayway.springsess ... -
spring父子容器与读取properties文件
2017-11-09 09:51 830读取properties文件中的内容,可以使用@Value ... -
Spring在代码中获取bean的几种方式
2017-11-08 09:46 1233方法一:在初始化时保存ApplicationContext对 ... -
Spring中DispacherServlet、WebApplicationContext、ServletContext的关系
2017-11-08 09:41 826解释一: 要想很好理解这三个上下文的关系,需 ... -
Spring以及SPringmvc相关问题: ServletContext -父子容器
2017-11-08 09:41 624总结如下: 明确了Servlet规范中Servl ... -
DelegatingFilterProxy
2017-11-08 09:48 1216摘要: 配置过滤器代理类,通过spring配置的bean来 ... -
DelegatingFilterProxy-api
2017-11-09 09:51 564为什么用DelegatingFilterProxy ... -
spring的启动过程——spring和springMVC父子容器的原理
2017-11-15 09:29 724要想很好理解这三个上下文的关系,需要先熟悉spri ... -
spring中bean被多次实例化问题
2017-11-13 09:33 52301. 描述 spring中提供了两种主要方式实例化bea ...
相关推荐
在"通过Configuration文件实现AOP.docx"文档中,可能会详细讲述如何在Spring配置文件中配置AOP代理,包括如何选择使用JDK动态代理还是CGLIB。 总结来说,JDK动态代理简单且高效,适合接口驱动的设计,而CGLIB适用于...
在实际应用中,Spring框架就同时使用了JDK动态代理和CGLIB。当目标对象实现了接口时,Spring会选择JDK动态代理;如果没有实现接口,则使用CGLIB。 总结来说,CGLIB和JDK动态代理都是为了实现运行时的方法拦截,但...
JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作原理。 **JDK动态代理** JDK动态代理基于Java反射API实现,它提供了`java.lang.reflect.Proxy`类和`java.lang.reflect....
Spring支持两种类型的动态代理:JDK动态代理和CGLIB代理。 - **JDK动态代理**:基于接口实现,如果目标对象实现了至少一个接口,Spring会选择使用JDK动态代理。代理对象会实现与目标对象相同的接口,并在调用接口...
- Spring支持两种类型的代理:JDK动态代理(如果目标对象实现了接口)和CGLIB代理(如果目标对象没有接口,使用字节码生成技术)。 - 在Spring配置中,可以使用`@Aspect`注解定义切面,`@Before`、`@After`、`@...
3. **CGLIB源码分析**: - 在CGLIB的源码中,`net.sf.cglib.proxy.Enhancer`是核心类,负责生成代理对象。它内部会使用ASM来创建子类,并通过`MethodProxy`对象来调用原方法。 - `...
在Java中,我们可以使用JDK自带的动态代理或者第三方库如CGLIB、Javassist、ASM来实现。 **JDK动态代理**: JDK的动态代理主要依赖于`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`两个类。...
它提供了一种更高级的动态代理机制,不仅可以基于JDK动态代理,还可以基于CGLIB库生成字节码实现代理。AOP允许开发者定义“切面”(Aspect),切面封装了关注点,如日志、事务、安全检查等,使得这些功能可以独立于...
在Spring AOP中,有两种主要的代理方式:JDK动态代理和CGLib代理。JDK动态代理基于接口,如果目标对象实现了至少一个接口,Spring会使用JDK的Proxy类生成一个代理对象。而如果没有接口或者接口方法不能满足需求,...
Spring 提供了两种类型的代理:JDK 动态代理和 CGLIB 代理。如果目标类实现了至少一个接口,Spring 默认使用 JDK 动态代理;如果没有实现接口,或者为了提高性能,Spring 可以选择使用 CGLIB 代理。 4. **JDK动态...
与JDK的动态代理不同,JDK代理基于接口,如果目标类没有实现接口,就无法使用JDK的动态代理。而CGlib则无需目标类实现任何接口,因此它的应用范围更广。 以下是使用CGlib实现动态代理的关键步骤: 1. 引入依赖:在...
在Spring框架中,当目标对象不支持JDK动态代理(即没有实现接口)时,CGLib就会被用来创建代理。CGLib通过创建目标类的子类并覆盖其方法来实现动态代理。使用CGLib的主要类有`net.sf.cglib.proxy.Enhancer`和`...
Spring CGLIB动态代理是Spring框架中的一种动态代理机制,它通过CGLIB(Code Generation Library)生成代理类来实现动态代理。CGLIB是一个高性能的开源代码生成包,能够在运行时生成指定对象的子类,从而实现动态...
Spring的AOP实现有两种方式:JDK动态代理和CGLIB字节码代理。当目标对象实现了一个或多个接口时,Spring会选择使用JDK动态代理。以下是Spring AOP使用JDK动态代理的基本步骤: 1. **创建代理对象**:Spring会创建一...
总结一下,Spring对动态代理的封装主要体现在AOP框架的设计上,它通过JDK动态代理和CGLIB实现了对目标对象的透明代理,方便地实现了面向切面编程。开发者可以通过配置XML或注解定义切面,使用通知来扩展或改变目标...
1. 高性能:相对于其他动态代理库(如Java的反射API或JDK动态代理),CGLIB的代理效率更高。 2. 易于使用:Spring框架已经封装了CGLIB的使用,开发者通常不需要直接与CGLIB库交互。 `spring-objenesis-repack-2.5.1...
在Java开发中,代理模式...当Spring容器创建一个Bean时,如果该Bean被标记为可代理的,Spring会使用JDK或CGLIB创建一个代理Bean,然后将这个代理Bean传递给BeanPostProcessor的`postProcessBeforeInitialization()`和`...
Spring支持JDK动态代理和CGLIB代理,根据目标对象是否实现接口来选择合适的代理方式。通过定义切面(Aspect),我们可以定义切入点(Pointcut)来指定何时应用增强(Advice),如环绕通知(Around advice)可以在...
CGLIB被广泛应用于Spring AOP(面向切面编程)中,用于实现对目标对象的动态代理,以提供方法拦截、事务管理、性能监控等功能。 首先,我们要理解什么是动态代理。在Java中,动态代理是一种在运行时创建代理类的...