问题标签 [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.

0 投票
2 回答
1862 浏览

spring - 如何让 Spring 控制器、AOP 和 JDK 代理一起工作

在我的带有方面注释的 spring 控制器中,我试图删除 CGLib 代理并用 JDK 动态代理替换它们。我知道当类没有实现接口时 Spring AOP 使用 CGLib,因为 JDK 动态代理只在接口上工作。我还意识到,接口和实现类上都需要有注解。但是,我遇到的问题是控制器不再显示为带有 JDK 代理的 bean。

我的控制器 bean 像这样被扫描:

这可行,但控制器显示为 CGLibController$$EnhancerByCGLIB$$5f0b2287:

这不起作用,它永远不会到达 bean 后处理器:

但是,如果我明确地创建这个 DynamicController bean,如

然后当我启动我的服务器时 ServletContext 抱怨说

bean初始化失败;嵌套异常是 java.lang.IllegalStateException:无法将处理程序“dynamicController”映射到 URL 路径 [some_url]:已经映射了类型为 [class $Proxy61] 的处理程序。

所以这里发生了一些事情,DynamicController 是一个动态代理。但我不知道还发生了什么,我知道它不再是一个 bean/控制器。我不想要“控制器、方面、动态代理:选择任何两个”我想要全部三个。这有可能吗?

0 投票
1 回答
3451 浏览

java - 为什么 cglib 调用 MethodInterceptor 回调失败?

在下面显示的 unittest 类中,一个测试失败,另一个测试成功。这两个测试都创建了一个CGLIB带有拦截器模拟的对象,并尝试验证拦截器是否与之交互。测试在使用 CGLIB 动态子类化的类上有所不同。成功的测试子类化一个普通的 Java 接口;失败的子类是一个动态子类(使用创建Mockito)。为什么第一次测试失败了?

谢谢。

更新:

失败的堆栈跟踪

此外,关于 Mockito 模拟是否是 CGLIB 增强类,下面的测试(失败)似乎表明它不是:

0 投票
1 回答
1214 浏览

java - 如何使用 Cglib 通过读取 XML 配置在运行时更新类的字段?

考虑到我们项目的通用性和灵活性,我们需要将字段和相关的 get/set 方法添加到具有XML配置文件中的列数组的基本类中。我正在考虑 Cglib 并对其进行了研究。

我了解到如何使用 Cglib 在应用程序中实现 AOP 功能,如下所示:

互联网上学习和研究 Cglib 的资源不足。我想从这里得到帮助。以下是我的详细问题。

1,我有一个基本的 POJO 类BasicUser,它最初是空的。

2、应用程序应该能够从 中读取包含名称、数据类型、长度等信息的字段列表,project.xml并将这些字段添加到 BasicUser 类中,然后应用程序使用更新的新类Cglib来满足业务需求。

我曾经想过使用 Map 来实现它,但它不是技术性的。哪位专业人士可以给我指导一下。

0 投票
1 回答
1471 浏览

maven - Maven Central 中的 CGLIB 3

所以,CGLIB 3 已经发布了几个月,看起来 Spring 3.2现在也在使用它——但不确定为什么它不在 Maven Central 上

是否存在另一个存在此依赖关系的 Maven 存储库?

0 投票
2 回答
1896 浏览

java - 使用基于 Java 的配置进行 Spring 3.2 单元测试

我正在使用带有基于 Java 的配置的 Spring 3.2,并且我的单元测试(JUnit 4.8.1)存在一些问题。所以这是一个测试运行器:

但是,我收到此错误:

正如Spring 博客所述,Spring 3.2 正在内联 CGLIB 3。那么为什么我会收到此错误?

我使用 Gradle 1.3 作为构建管理工具,使用 STS 作为 IDE。调用gradle eclipsegradle 时会两次引入依赖项:一次作为普通 jar,一次作为库:

首先是普通的罐子: 普通罐子

而不是作为图书馆:

图书馆

在普通的 jar 部分我仍然配置了 Spring 3.1,而在库部分有 Spring 3.2。所以我移除了普通的罐子,一切正常。

这是我的项目 build.gradle

以及来自主项目的 build.gradle

0 投票
4 回答
5445 浏览

spring - Spring 3.1 无法加载配置类:

我正在开发带有 Spring 3.1.0 的 Rest Service 的项目。发布。我正在使用 Config 类来加载 bean。正如建议的那样,使用 cglib 2.2 和 asm-3.3 jars。

这在 websphere 8.5 中失败,但有以下异常。但适用于 Apache Tomcat 7.0。

有关如何解决此问题的任何建议。

尝试使用不同版本的 cglib 和 asm jar,但没有运气..

0 投票
1 回答
617 浏览

spring - 在 Spring aop + cglib 中配置代理 bean

我们有一个使用 spring-aop 和 cglib 库的 Spring 3.1 Web 应用程序。春天.xml:

这意味着将使用 cglib 为每个 bean 创建一个代理。

现在我们需要使用带有 com.mchange.v2.c3p0.ComboPooledDataSource 的 db 连接池 bean:

问题是 ComboPooledDataSource 类被标记为 final。而且 cglib 不能代理 final 类。

如何标记“connectionPool”bean 不被代理?

0 投票
1 回答
694 浏览

java - 如何在运行时实现参数化接口?

我已经检查了 Java 代理和 cglib,但我还没有找到任何关于我将如何开始这个项目的示例。

这是我需要做的。

我有一个界面:

我有一堆不同类型的城市作为一个名为的类的内部类Cities

我希望能够通过循环遍历类的不同内部类来在运行时实现接口,Cities如下所示:

除了类型参数需要是 clazz 类型(在 for 循环中)之外,所有实现都是相同的。

这甚至可能吗?如果是这样,我应该从哪里开始。Java 代理和 cglib 谈论了很多方法拦截,但这并不是我真正想要做的。

谢谢

0 投票
1 回答
1535 浏览

java - 对 Cglib MethodInterceptor 调用方法感到困惑

正如文档描述的那样,我对 Cglib MethodInterceptor 有一些困惑:所有生成的代理方法都调用此方法而不是原始方法。原始方法可以使用 Method 对象通过正常反射调用,也可以使用 MethodProxy(更快)调用。

但是下面的代码有 java.lang.reflect.InvocationTargetException 引起的错误;为什么?任何建议将不胜感激。

}

0 投票
1 回答
1010 浏览

java - 简单选择上的 lambdaJ 和 ClassCastException

我的想法用完了,谷歌也没有帮助。用例似乎微不足道,但因 ClassCastException 而失败。我不知道我做错了什么。有一个简单的方法可以返回匹配给定类别的第一个元素,看看。

执行给出了堆栈的顶部:

我在使用 lambdaJ 对 hibernate 的持久集合进行操作时遇到了同样的问题。我放弃了假设已经是代理的代理对象(集合中的实体)可能存在一些问题。看来我错了,因为类别和所有继承的类都是作为结果转换器传递给休眠的 pojos。

这种行为的原因可能是什么?你有什么主意吗?

(我使用的是最新的 lambdaj-2.4)。

添加以满足马里奥的要求

代码是一个简单的枚举。类别是不同类别的基类,它有代码字段。此外,它是公共静态类,与所有继承类相同(如果重要的话)。

我将尝试提供失败的测试。

再次编辑以提供更多信息。 我的一个朋友查看了代码,并对这个问题提出了新的看法。

我将尝试从一开始就重现我们的演绎路径。

// 给定

有一个应用程序分为两部分,第一个基础应用程序(保存模型文件)和 Web 应用程序(保存 UI 连接文件,如 backing beans 等)。 我们的类别和代码是模型类,因此位于基础应用程序中。然后我们有一个支持 bean 服务于一些 web 逻辑,特别是 bean 或其合作者调用我们的 select。

// 什么时候

我们正在将应用程序部署到 Web 服务器!就我而言,JBoss。类由加载器读取,一些我不知道的非常复杂的事情发生了,所有这些都是为了让我的应用程序运行。我做了一些网络操作,然后调用了支持 bean 的方法

从应用程序的 Web 部分。

魔法来了。我们的 Category.class 和 Code.class 由 UnifiedClassLoader 在应用程序加载时加载。我们在on(Category.class)方法中,并且将构建 Category 的代理。一些真正纠结的逻辑被用来做到这一点,最重要的是,代理是用

方法,但 Callback.class 取自该类加载器

因此,最初加载该类 UnifiedClassLoader 的是一个类加载器。干净地完成所有这些之后,我们终于打电话给

使用反射浏览代理类寻找: Proxy.getDeclaredMethod("setThreadsCallbacks", new Class[]{ Callback[].class });

我忽略了事实,我不明白

在我们的例子中重要的是 Callback.class 不是由 UnifiedClassLoader 提供的。应用程序在网络轮胎中执行,因此对 Callback.class 的调用将通过网络应用程序进行服务器。类加载器和返回的 Callback.class 将与之前作为提到的setThreadsCallbacks函数的参数放置的内容不同。反思残酷地失败了。

这就是为什么我无法提供失败的测试。(相同的类加载器)。

我怀疑这种情况有什么解决方案。