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

0 投票
1 回答
1437 浏览

java - 识别 Java 代码中未使用的变量

我需要识别 Java 代码中未使用的变量(参数、局部变量、类成员变量)。基本上我必须使用 BCEL 来访问字节码并达到我的目标。

我已经使用 ClassGen 来获取所有调用的方法,然后通过使用 MethodGen 我设法获取所有局部变量和函数参数。但是我仍然无法区分已使用和未使用的变量。

我猜我必须访问 JVM 堆栈才能查看实际加载了哪些变量以及未使用哪些变量。

所以问题很简单:如何使用 BCEL 访问 JVM 堆栈?

0 投票
1 回答
780 浏览

java - 使用bcel时构造方法的stackmap

我正在尝试通过在特定指令之前插入调用来修改方法。似乎我的检测会导致不同的堆栈映射表,该表不能由 bcel 包本身自动生成。因此,我的检测类文件包含旧的堆栈映射表,这会导致 jvm 出错。我已经尝试过使用 MethodGen 的方法 removeCodeAttributes,它可以删除所有代码属性。它可以在简单的情况下工作,例如包装函数。它现在不能在我的情况下工作。

0 投票
1 回答
416 浏览

java - 将“new Class[]{String.class}”放入堆栈的 BCEL 代码示例

我正在寻找关于如何创建包含 java.lang.Class 实例的大小为 1 的数组并使用对 java.lang.String.class 的引用初始化其唯一元素的 BCEL 代码示例

换句话说,我正在寻找一个 BCEL 代码示例来将“new Class[]{String.class}”放在堆栈上。

谢谢。

0 投票
1 回答
1554 浏览

java - BCEL - 获取类名、元素名和方法名

如何使用 bcel classparaser 获取类名、元素名和方法名?我已经找到了一种获取类名的方法,但是元素和方法名给了我一些错误。任何人都可以帮助我吗?这是我的代码(有一些错误,没有完成):

0 投票
2 回答
4525 浏览

java - 解析 Jar 文件并查找类之间的关系?

如何检测 jar 文件中的类是否在扩展其他类,或者是否有对其他类对象的方法调用或创建了其他类对象?然后系统出哪个类扩展哪个类以及哪个类从哪个类调用方法。

我使用 Classparser 来解析 jar 。这是我的代码的一部分:

0 投票
2 回答
1603 浏览

java - 使用 BCEL 在 JUnit 测试用例中替换 runimte 的方法调用?

我有一个类去服务器执行查询,我想做的是用一个返回一些罐头的模拟调用替换那个调用(这需要一个实时服务器在后台启动并运行)用于单元测试的响应。

我是 BCEL 的新手,我看过这篇文章,尽可能地对其进行了调整,但似乎无法让它为我工作:

替换Java中的静态引用方法

这是一些代码:

在这里,在我的单元测试开始时,我试图将调用替换为

ServerApi.evaluateQuery( 字符串 )

查询调用者

上课打电话给

MockServerApi.evaluateQuery(String)

其中两个 evaluateQuery() 方法都返回 QueryResultSet 类型的对象。

但是,当我运行它时(并且为了在此处发布它,我不得不稍微修改此代码)我得到一个堆栈 underFlow:

java.lang.VerifyError: JVMVRFY036 堆栈下溢;class=org/foo/QueryCaller, method=$ServerApi$evaluateQuery(Ljava/lang/String;)Lorg/foo/QueryResultSet;, pc=0 at java.lang.J9VMInternals.verifyImpl(Native Method) at java.lang.J9VMInternals .verify(J9VMInternals.java:93) at java.lang.J9VMInternals.initialize(J9VMInternals.java:170) at org.foo.TestClass.test(TestClass.java:110) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method ) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 在 java.lang.reflect.Method.invoke(Method.java:613) 在 org .junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 在 org.junit.internal.runners.model。

有什么想法吗?

-GY

0 投票
1 回答
138 浏览

java - 在方法体内检测中介本地方法调用

我知道(例如,至少使用 BCEL 或 ASM),有可能以某种方式访问​​方法的局部变量......但是,我需要更多的东西,我想要的是:

  1. 获取此类变量的类型(或从签名转换的方式)
  2. 知道(区分)何时使用此变量(或者看到它的值受到影响,或者作为参数传递)
  3. 当这个变量被用作参数时,要知道它被传递给了哪个方法调用
  4. 在各自的方法调用中打破“方法链”并获取它们的返回值,以便我可以操纵它们

基本思想是,我想以与调试器相同的方式“检测”方法(尽管仅限于第一帧深度......)。

任何指针表示赞赏。如果需要更多信息,请随时询问。

0 投票
1 回答
426 浏览

java - 使 Java 编译器在类文件中包含符号常量字段引用 - 可能吗?

众所周知,Java 编译器会在编译时从其他类中提取常量字段值。生成的类文件不包含此类常量的常量池条目(任何类型)。

问:可以告诉编译器这样做吗?(Oracle JDK 7 会很好)

作为说明,考虑一段 out.println(some.other.class.FOO)读取 FOO(例如public static final int FOO = 1234)并输出它的代码。我能够找到println没有问题的引用,但是常量变成了匿名的sipush 1234

对于类级别的依赖关系分析,在这里有透明度会很棒!请注意,我并不是要求在依赖代码中以某种方式出现任何更改的值(请参阅有关该问题的大量其他 SO 问题)...

我正在考虑 javac 的 Java Compiler API 插件,但这听起来有点牵强?有任何想法吗?

0 投票
1 回答
1383 浏览

java - 使用 javaagent 运行时获取“java.lang.NoClassDefFoundError”

我正在尝试使用 BCEL使用javaagent.jar检测 jar 文件( main.jar) 。基本上,无论何时我在字节码中找到任何负载,我都试图在“someclass”类中插入一个对名为 Fun() 的静态函数的函数调用

我的“someclass”类驻留在 javaagent.jar

在执行

或者

或(我为我的“someclass”创建了一个单独的 jar,名为someclasscontained.jar

我正进入(状态

错误。我尝试使用-bootclasspath/p选项,但仍然无法正常工作。有人知道吗?

(1)所有 jar 都位于同一个文件夹中 2)这个问题可能与一个问题相似,但该问题的解决方案不正确/不令人满意,所以请不要将其标记为重复)

0 投票
1 回答
3342 浏览

java - 使用 BCEL 时出现错误“java.lang.VerifyError: StackMapTable error: bad offset”

我正在使用 BCEL 进行 Java 检测。我的 java 代理正在针对一些 Java webapp 进行测试,该应用在 tomcat8.0 服务器上运行。如果我不对 JVM 中的每个类加载进行检测(或者不对以 java、javax... org.apache/* 开头的包进行检测),那么它可以正常工作..

但是如果我在 tomcat(包 org.apache/*)上进行检测,那么我会收到“StackMapTable 错误:偏移量错误”错误。

我知道tomcat在仪器开始之前正在运行。但是根据运行时检测,检测仅在类即将加载时才发生,而不是在加载之后。因为 tomcat 已经在运行,所以这些类已经在 J​​VM 中,我只检测引入 JVM 的新类,所以如果 tomcat 无关紧要是否正在运行,因为我没有触及已经在 J​​VM 中的类。有人知道吗?