- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的想法用完了,谷歌也没有帮助。用例似乎微不足道,但它因 ClassCastException 而失败。我不知道我做错了什么。有一个简单的方法可以返回与给定类别匹配的第一个元素,请看一看。
private Category selectElement(List<? extends Category> results, Code code) {
return selectFirst(results, having(on(Category.class).getCode(), is(code)));
}
执行给出栈顶:
java.lang.ClassCastException: name.wilu.logic.report.utils.SheetLoader$Category$$EnhancerByCGLIB$$3a35aefc cannot be cast to net.sf.cglib.proxy.Factory
at ch.lambdaj.proxy.ClassImposterizer.createProxy(ClassImposterizer.java:134)
at ch.lambdaj.proxy.ClassImposterizer.imposterise(ClassImposterizer.java:101)
at ch.lambdaj.proxy.ProxyUtil.createProxy(ProxyUtil.java:52)
at ch.lambdaj.function.argument.ArgumentsFactory.createPlaceholder(ArgumentsFactory.java:68)
at ch.lambdaj.function.argument.ArgumentsFactory.registerNewArgument(ArgumentsFactory.java:58)
at ch.lambdaj.function.argument.ArgumentsFactory.createArgument(ArgumentsFactory.java:50)
at ch.lambdaj.function.argument.ArgumentsFactory.createArgument(ArgumentsFactory.java:39)
at ch.lambdaj.Lambda.on(Lambda.java:63)
我在使用 lambdaJ 对 hibernate 的持久集合持有实体进行操作时遇到了同样的问题。我放弃了假设已经是代理的代理对象(集合中的实体)可能存在一些问题。看来我错了,因为类别和所有继承的类都是作为结果转换器传递给 hibernate 的 pojos。
这种行为的原因可能是什么?你有什么想法吗?
(我使用的是最新的 lambdaj-2.4)。
添加以满足马里奥的要求
代码是一个简单的枚举。Category 是不同类别的基类,它有代码字段。此外,它是公共(public)静态类,与所有继承类相同(如果重要的话)。
我会尝试提供失败的测试。
再次编辑以提供更多信息。我的一个 friend 查看了代码,并对这个问题提出了新的看法。
我会尝试从头开始重现我们的演绎路径。
//给定
有一个应用程序分为两部分,第一部分 - 基础应用程序(保留模型文件)和 Web 应用程序(保留 UI 连接文件,如支持 bean 等)。我们的类别和代码是模型类,因此位于基础应用程序中。然后我们有一个支持 bean 服务于某些 Web 逻辑,特别是那个 bean 或其合作者调用我们的选择。
//什么时候
我们正在将应用程序部署到网络服务器!在我的例子中是 JBoss。类由加载器读取,一些我不知道的非常复杂的事情发生了,所有这些都是为了让我的应用程序运行。我做了一些网络操作,支持 bean 的方法被调用
selectFirst(results, having(on(Category.class).getCode(), is(code)));
来自应用程序的 Web 部分。
魔术来了。我们的 Category.class 和 Code.class 由 UnifiedClassLoader 在应用程序加载时加载。我们在 on(Category.class) 方法中,Category 的代理将被构建。一些非常复杂的逻辑被利用来做到这一点,最重要的是,代理是用
setThreadsCallbacks(Callback[]callbacks)
方法,但 Callback.class 是从那个类加载器中获取的
aCategory.getClass.getClassLoader()
因此它是一个最初加载该类的类加载器,即 UnifiedClassLoader 。干净利落地完成所有这些之后,我们终于调用了
getFirstInstance()
使用反射浏览的Proxy类寻找: Proxy.getDeclaredMethod("setThreadsCallbacks", new Class[]{ Callback[].class });
我省略了事实,我不明白
new Class[]{ Callback[].class }
在我们的案例中重要的是 Callback.class 不是由 UnifiedClassLoader 提供的。应用程序在网络轮胎中执行,因此对 Callback.class 的调用将由网络应用程序服务器提供。类加载器和返回的 Callback.class 将不同于之前作为提到的 setThreadsCallbacks 函数的参数。反射残酷地失败了。
Category.class != Category.class //these two were provided by different classLoaders
这就是我无法提供失败测试的原因。 (相同的类加载器)。
我怀疑这种情况是否有任何解决方案。
最佳答案
我遇到过类似的问题。 (抛出同样的异常:java.lang.ClassCastException: XXX$Category$$EnhancerByCGLIB$$XXX cannot be cast to net.sf.cglib.proxy.Factory)
在我的例子中,结果证明是重复的(甚至是三倍的)CGLib 库的问题。我们有如下:
然后,当使用 Lambda.on(SomeClass.class) 时,我们在 CGLib 的 Enhancer
类中找到了这个方法:
private static Method getCallbacksSetter(Class type, String methodName) throws NoSuchMethodException {
return type.getDeclaredMethod(methodName, new Class[]{ Callback[].class });
}
其中 methodName = "CGLIB$SET_THREAD_CALLBACKS"
type 是由 Enhancer
包装的 SomeClass。
“CGLIB$SET_THREAD_CALLBACKS”方法存在于包装类型中,但 getDeclaredMethod() 返回 null。似乎在 getDeclaredMethod() 内部有两个 net.sf.cglib.proxy.Callback.class
实例的比较。它们是不同的,因为一个是从 cglib.jar (JBoss) 加载的,另一个是从 cglib-nodep.jar (webapp) 加载的。
解决方案是删除多余的 cglib-nodep.jar 并将 lambda-2.4-with-dependencies.jar 替换为 lambda-2.4.jar。现在所有 CGLib 类都从公共(public)位置加载,问题已经解决。
关于java - 简单选择上的 lambdaJ 和 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14439864/
我正在努力实现以下目标, 假设我有字符串: ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ) ) ) ) ) 我想编写一个正则
给定: 1 2 3 4 5 6
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
大家好,我卡颂。 Svelte问世很久了,一直想写一篇好懂的原理分析文章,拖了这么久终于写了。 本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一
身份证为15位或者18位,15位的全为数字,18位的前17位为数字,最后一位为数字或者大写字母”X“。 与之匹配的正则表达式: ?
我们先来最简单的,网页的登录窗口; 不过开始之前,大家先下载jquery的插件 本人习惯用了vs2008来做网页了,先添加一个空白页 这是最简单的的做法。。。先在body里面插入 <
1、MySQL自带的压力测试工具 Mysqlslap mysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出
前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、简单、实用的数据库文档(字典)生成工具,该工具支持CHM、Word、Excel、PDF、Html、XML、Markdown等
Go语言语法类似于C语言,因此熟悉C语言及其派生语言( C++、 C#、Objective-C 等)的人都会迅速熟悉这门语言。 C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的
我正在使用快速将 mkv 转换为 mp4 ffmpeg 命令 ffmpeg -i test.mkv -vcodec copy -acodec copy new.mp4 但不适用于任何 mkv 文件,当
我想计算我的工作簿中的工作表数量,然后从总数中减去特定的工作表。我错过了什么?这给了我一个对象错误: wsCount = ThisWorkbook.Sheets.Count - ThisWorkboo
我有一个 perl 文件,用于查看文件夹中是否存在 ini。如果是,它会从中读取,如果不是,它会根据我为它制作的模板创建一个。 我在 ini 部分使用 Config::Simple。 我的问题是,如果
尝试让一个 ViewController 通过标准 Cocoa 通知与另一个 ViewController 进行通信。 编写了一个简单的测试用例。在我最初的 VC 中,我将以下内容添加到 viewDi
我正在绘制高程剖面图,显示沿路径的高程增益/损失,类似于下面的: Sample Elevation Profile with hand-placed labels http://img38.image
嗨,所以我需要做的是最终让 regStart 和 regPage 根据点击事件交替可见性,我不太担心编写 JavaScript 函数,但我根本无法让我的 regPage 首先隐藏。这是我的代码。请简单
我有一个非常简单的程序来测量一个函数花费了多少时间。 #include #include #include struct Foo { void addSample(uint64_t s)
我需要为 JavaScript 制作简单的 C# BitConverter。我做了一个简单的BitConverter class BitConverter{ constructor(){} GetBy
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是 Simple.Data 的新手。但我很难找到如何进行“分组依据”。 我想要的是非常基本的。 表格看起来像: +________+ | cards | +________+ | id |
我现在正在开发一个 JS UDF,它看起来遵循编码。 通常情况下,由于循环计数为 2,Alert Msg 会出现两次。我想要的是即使循环计数为 3,Alert Msg 也只会出现一次。任何想法都
我是一名优秀的程序员,十分优秀!