问题标签 [cglib]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 在运行时将 Spring bean 定义加载到 XmlWebApplicationContext 后的 CGLIB 代理错误
我在运行时将额外的单例 bean 定义从外部 jar 文件加载到我的应用程序的现有 XmlWebApplicationContext 中:
毕竟上面的 xmlWebApplicationContext 包含 bean 的所有外部定义。但是当我试图从上下文中获取bean时抛出异常:
Couldn't generate CGLIB proxy for class ...
我在调试模式下看到,在 bean 初始化过程中,第一次代理是由
org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator
然后尝试生成代理
org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator
但因提到的异常而失败。
java - 休眠中的 Javassist 失败:无效的常量类型:60
我正在创建一个 cli 工具来管理现有应用程序。应用程序和测试都构建良好并且运行良好,但尽管我在运行 jar 中存在的 cli 工具时收到 javassist 失败:
因为我知道 jar 在单元和集成测试上运行时很好,我认为这可能是 javassist 的问题,所以我尝试了 cglib。字节码提供程序然后显示为 cglib,但我仍然得到完全相同的堆栈跟踪,其中存在 javassist。
cglib 肯定在类路径中:
我已经尝试过使用休眠 3.4 和 3.5 并得到完全相同的错误。这是 javassist 的问题吗?
更新:我可以在 Eclipse 中成功运行应用程序(右键单击->运行方式->Java 应用程序),但使用 maven 生成的 jar-with-dependencies 失败。我认为不同之处在于 Eclipse javassist 不是检查包含的 jar,而是检查所有的类文件(可能还有一些依赖的 3rd-party jar)。
java - 模拟接口的廉价方法,没有运行时开销
假设我有一个包含很多方法的接口,我想模拟这些方法进行测试,并且假设我不需要它来做任何事情,我只需要被测对象有一个实例。例如,我想对某些代码运行一些性能测试/基准测试,并且不希望此接口上的方法做出贡献。
有很多工具可以轻松做到这一点,例如
管他呢。
但是,它们都带有一些我宁愿避免的运行时开销:
- Mockito 记录所有调用,存储参数以供稍后验证
- JMock 和其他人(我相信)要求您定义他们要做什么(没什么大不了的),然后执行通过各种代理来实际调用该方法。
- 好老的 java.lang.reflect.Proxy 和朋友们在到达要调用的方法之前,都至少在堆栈上进行了几次方法调用,通常是反射性的。
(我愿意纠正这些例子的任何细节,但我相信原则是成立的。)
我的目标是接口的“真正的”无操作实现,例如我可以手动编写所有返回null
的 ,false
或0
. 但是,如果我感到懒惰并且界面有很多方法,那也无济于事。那么,如何在运行时生成和实例化任意接口的这种无操作实现呢?
有一些可用的工具,如 Powermock、CGLib,它们使用字节码生成,但只是作为更大的模拟/代理上下文的一部分,我还没有弄清楚要从内部挑选什么。
好的,所以这个例子可能有点做作,我怀疑代理会对时间产生太大的影响,但我现在很好奇如何生成这样的类。在 CGLib、ASM 中容易吗?
编辑:是的,这是过早的优化,没有真正需要这样做。在写完这个问题之后,我认为最后一句话并没有完全说明我对原则上如何做到这一点更感兴趣,以及与我给出的实际用例相比,动态类生成的简单方法。也许从一开始就措辞不佳。
java - 如何让我的 CGLIB 代理类与 Spring 框架的 ReflectionUtils 一起使用?
我有一个 cglib 代理类,因为 impl 使用了 @Repository @Transactional 注释。
我想使用spring的反射工具来设置字段值以模拟其中一个字段。
但是当反射工具在我的课堂上找不到该字段时。
我怎样才能让它工作?所以我可以模拟这个领域(合作者)。
cglib - 将状态添加到通过 CGLIB 的 BeanGenerator 生成的 bean
我看到以下有关如何动态创建 Java Bean 的示例代码。我无法弄清楚的是如何在创建后更新实例的状态。那么在下面的示例中,如何将 foo 的值设置为“footest”,例如 bean?
BeanGenerator bg = new BeanGenerator();
bg.addProperty("foo", Double.TYPE);
bg.addProperty("bar", String.class);
对象 bean = bg.create();
谢谢库马尔
java - 抽象 DAO 模式和 Spring 的“Proxy cannot be cast to ...”问题!
我知道这经常被问到,但我找不到可行的解决方案:
这是我的 AbstractDAO :
这是我的 JPA 的实现:
这是一个实体的道:
这是它的实现:
整个架构很简单:
接口AbstractDao定义了简单的 CRUD 方法。
接口PersonDao扩展了 AbstractDAO,没有任何附加方法。
类AbstractDaoJpaImpl定义了 JPA 的 AbstractDao 实现
类PersonDaoImpl扩展了 AbstractDaoJpaImpl 并实现了 PersonDao AND OtherInterface ,它添加了附加方法() ...
如果, PersonDaoImpl 只实现 PersonDao ,没有实现 OtherInterface.additionalMethods() ,一切正常。
我可以用
在我春天的 XML 文件中。
但是, PersonDaoImpl 实现 OtherInterface(s) ,在测试/运行时,我必须将 DAO 从 PersonDao 转换为 PersonDaoImpl 或 OtherInterfaces,例如:
问题发生时(PersonDaoImpl) dao
,抛出“Proxy cannot be cast to PersonDaoImpl”异常:
google的时候经常会问到这个,大家建议proxy-target-class="true"
加到<tx:annotation-driven>
:
这将使用 CGLIB 而不是 JDK 的动态代理。
但是在初始化 Spring 时它会引发另一个异常:
在 AbstractDaoJpaImpl 的构造函数中:
每个问题都停在这里,我现在找不到任何可行的解决方案。
谁能给我一个可行的解决方案?非常感谢 !
环境:Spring-3.0.4,javaee-api-6.0,javax.inject,cglib-2.2,hibernate-jpa-2.0-api-1.0.0,
java - Java,动态创建接口?
我正在寻找一种在运行时创建接口的解决方案。我真的不知道这是否可能。
问题:
我有一个 OSGi 服务,它发布了一个Map<String,String>
密钥定义该服务的操作的地方。我想直接将此服务作为Hessian
服务与 spring 发布,但为此,我需要删除一个接口。现在我想在运行时创建这个接口。
java - 使用 cglib 覆盖本地包方法
我正在开发一个 Java 库,它使用 cglib 创建库用户提供的抽象类的子类,并提供用户留下的抽象方法的自动生成实现。
我的问题是,如果所讨论的方法具有包本地(即默认)可访问性,那么我生成的方法显然被忽略了,并且用户在调用它时会得到一个 AbstractMethodError 。
我生成的类与原始类在同一个包中(我生成一个名称为 original.package.OriginalClassName_AutomaticImplementation 的类),尽管它们当然是由不同的类加载器加载的(即加载由 cglib 生成的字节数组而不是比磁盘文件);我怀疑这是问题所在。如果是这样,有什么办法可以解决吗?
c# - 有没有人有使用 cglib MulticastDelegate 执行 C# 事件之类的示例代码?
虽然 C# 支持 Java 中的委派和事件,但我们必须使用匿名内部类进行绑定,否则使用反射代码http://oatv.com/pub/a/onjava/2003/05/21/delegates.html。在该页面的评论中有关于 CGLib Multicast Delegates 的提示,但谷歌代码似乎不知道该类的任何示例代码。有没有人有一个工作示例的链接,其他人触手可及?
java - cglib 编译器 jdk 合规性
我在同事的盒子上遇到了一个奇怪的错误。CGLib 正在为 Spring AOP 日志记录自动代理服务类,并且在运行时它通过 cglib 代理类在 fastclass 上显示“未解决的编译错误:必须覆盖超类方法”。
在有问题的类中,我在实现接口时使用了@override 注释,并且我知道它在 jdk 1.6 中受支持,但在 1.5 中不受支持。CGLib 正在自动代理该实现类。
但是,它在我的带有 jdk_1.6_17 的盒子上运行良好,但在他的带有 jdk_1.6_10 的盒子上却不行。
但是,他可以使用使用相同 jdk 的 maven 正确编译项目。删除 @Override 注释修复了运行时 cglib 错误,但这很奇怪吧?
cglib 使用什么编译器进行自动代理,这可能是 jdk_1.6_10 中的错误还是我还缺少其他东西?
使用弹簧 3.0.4、jboss 5.10、弹簧安全 3.0.3
基本上,该类在spring-security中实现了AuthenticationUserDetailsService。
有问题的方法签名:
UserDetails 是一个 spring-security 接口,Authentication 也是。