问题标签 [bcel]
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 - BCEL == java 的猴子补丁吗?
前几天,一位同事向我指出了BCEL,从他的解释和快速阅读中我可以看出,这是一种在运行时修改字节码的方法。我的第一个想法是它听起来很危险,我的第二个想法是它听起来很酷。然后我想了想,想起了关于猴子补丁的编码恐怖帖子,并意识到这基本上是一回事。有没有人用过 BCEL 做任何实用的事情?我是对的,这基本上是运行时猴子补丁,还是我错过了什么?
java - 从任意 .class 文件创建一个 BCEL JavaClass 对象
我在玩BCEL。我不是用它来生成字节码,而是试图检查现有编译类的结构。
我需要能够指向硬盘驱动器上任意位置的任意 .class 文件并基于该文件加载JavaClass对象。理想情况下,我想避免将给定的类添加到我的类路径中。
bcel - bcel 中的静态初始化器
在 BCEL 中,我想在类的静态初始化程序中初始化静态字段。但是,我还没有找到这样做的方法……有什么提示吗?
我需要类似的东西:
然而,我似乎只能生成(使用MethodGen
)类似的东西:
这当然不一样。
java - FindBugs 不接受 ANT 脚本中的 bcel.jar
我将 findbugs 安装到我的 ant lib 目录中,并将以下代码添加到我的主 ANT 脚本中:
在 init 目标中调用以下 xml:
在运行 ANT 脚本时,我得到的只是以下输出:
为什么 findbugs 不起作用?
java - Ant loadproperties 失败(bcel 错误?)
我正在开发一个简单的构建脚本,它应该从 java 类文件中获取一些常量,并将它们用作我的文件名中的版本号。我使用 Eclipse 和它自己的 Ant,但将bcel-5.2.jar放在我的 libs 文件夹中并放入 Ant 调用的类路径中。
但不幸的是,蚂蚁任务loadproperties失败了:
之后,我尝试使用以下命令行从 Eclipse 外部运行 Ant:
结果是
我现在真的迷路了。是bcel错误吗?是否与我自己的 bcel 不兼容?
最后一个提示:从 Ant 目标中删除 bcel 类路径条目会导致:
UPDATE在 Eclipse 中设置 Ant 首选项后,错误消息发生了变化:
现在我认为这可能是Ant和BCEL之间的版本冲突。或者BCEL和JDK1.6。或者 Eclipse 和 BCEL 和 Ant 或 JDK……我迷路了。
回答:
这是在下面找到的评论
我应该提到这一点 - 你不需要转换任何东西。文档:“从 Ant 1.7 开始,字符编码 ISO-8859-1 用于将字符转换回字节,因此必须使用此编码来读取 java 类文件。” 这只是为了绕过字符过滤器用于原始字节这一事实的约定。ant.apache.org/manual/CoreTypes/... 使用 UTF-8 会很糟糕!——麦克道尔
java - 从Java中的行号找出方法名称?
给定行号、代码文件以及编译后的类文件(如果需要),获取周围方法签名的最优雅方法是什么(如果行号在方法中是偶数)?
要记住的事情:
- 该行甚至可能不在方法中
- 该行可能在内部或匿名类的方法中
在谷歌搜索时,我发现了这个重复的问题,所以我自己关闭它。
java - 字节码:LOOKUPSWITCH 和 TABLESWITCH
我目前正在使用 BCEL 检测字节码。在 BCEL API 中,两个指令类型LOOKUPSWITCH
和TABLESWITCH
( package org.apache.bcel.generic
) 是实现接口StackProducer
。我知道这两条指令会弹出操作数堆栈(即消耗它)并且不会在堆栈上产生任何东西,那么它们如何实现StackProducer
而不是StackConsumer
呢?这是一个错误吗?谢谢
(ps:我试图在BCEL邮件列表上发布这个问题没有答案。我希望我能在这里找到更多的运气)
java - 更改类加载器
我正在尝试在运行时切换类加载器:
和:
(InjectingClassLoader是一个扩展org.apache.bcel.util.ClassLoader的类,它应该在询问它的父类之前加载类的修改版本)
我想让“方法 1”和“方法 2”的结果完全相同,但看起来thread.setContextClassLoader(classLoader)什么都不做,“方法 2”总是使用系统类加载器(可以通过比较来确定tcl 和 ccl 变量,同时调试)。
是否可以让新线程加载的所有类都使用给定的类加载器?
java - 在堆栈操作中出现奇怪的错误
作为我使用名为 JIST/SWANS 的工具运行的一些模拟的一部分,我遇到了一些奇怪的错误。这个模拟器是为 Java 1.4 编写的,我正在尝试将它移植到 1.5。
我要做的是用 1.5 SDK 编译原始代码。问题是模拟器使用bcel重写字节码,以便 JVM 可以用于模拟。当我在新的 SDK 下编译代码时,我得到下面给出的错误。有人可以指出我正确的方向来解决这个问题吗?我知道 1.4 和 1.5 生成的字节码有些不同,但我不知道从哪里开始寻找。
更新: 我从抛出异常的地方缩小到这一行:
类中有一个main
方法正在传递给这个函数,所以我不知道它为什么返回一个null
.
更新 2:
有一个功能:
它将 传递MyClient.class
给在上面发布的方法中使用 this 的函数findMain
。使用调试器,我可以看到declaredMethods
很null
明显getDeclaredMethods
调用正在消亡。该类MyClient
通过以下方式定义为内部静态类:
我不确定这是否与declaredMethods
存在有关,null
所以我尝试将该类提取到一个单独的类中,但没有运气。
更新 3:
好的缩小范围。以下即使在主类中也会引发异常:
java - 动态字节码执行
好的,所以我正在尝试编写一个通用的字符串去混淆器(类似于 .NET 与 Simple Assembly Explorer 的功能)
我想要做的是通过 BCEL 获取方法的指令,并使用我提供的参数执行它们,并可以访问该方法的输出。这可能与任何现有的库有关吗?如果是这样,我可以得到一些帮助吗?
谢谢