当前位置: 首页 > 知识库问答 >
问题:

寻找具体类类型的ASM变换

马国源
2023-03-14

我正在做一个项目,它将跟踪从包中的类到任何其他类的方法调用。我能够识别具体的类型是很重要的,而且我更希望有最小的跟踪开销。探针何时触发没有限制;它可以在调用方法之前或之后。

目前使用ASM,但对它没有要求。系统正在从AspectJ转移,以便允许动态附件,所以这是out。

下面是目前的情况。“Tracer”枚举/单例接收探测(int)并处理调用。查找从具体类型到引用类型的调用就足够了。

@Override
void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
    Integer probeID = Tracer.INSTANCE.probes.createProbeIDAt(new Call(owner, name, desc))

    super.visitFieldInsn(GETSTATIC, "org/flightofstairs/honours/capture/agent/Tracer", "INSTANCE", "Lorg/flightofstairs/honours/capture/agent/Tracer;");
    super.visitLdcInsn(probeID)
    super.visitMethodInsn(INVOKEVIRTUAL, "org/flightofstairs/honours/capture/agent/Tracer", "probe", "(Ljava/lang/Integer;)V")

    super.visitMethodInsn(opcode, owner, name, desc);
}

我进一步的想法是以某种方式获取对被调用类的引用,并调用getClass()来检索具体类型。如果堆栈包含位于INVOKEINTERFACE顶部的对象ref,但被调用方法的任何参数都放在其上方,那么这将是微不足道的。

有什么建议吗?

干杯。

共有1个答案

孔飞翔
2023-03-14

一个解决方案是在遍历过程中记录INVOKEINTERFACEs。最后,可以使用ASMs Analyser查找将objectref推到堆栈上的指令,从那里添加getClass()和跟踪代码很简单。

这里给出了一个解决方案。https://gist.github.com/2795738

 类似资料:
  • 我是java字节编码的新手,我已经在这个问题上挣扎了一段时间。我使用的是java ASM字节码工程库。我希望找到特定方法调用的实现这些方法的所有方法和类。被调用方法的名称和说明,以及实现被调用方法的类的名称。问题是,当被分析的方法调用接口或抽象类中定义的方法时,我找不到实际实现被调用方法的具体类的名称。这里也是我的一些代码和测试输出,可视化的情况。 和输出:

  • 我为协变返回类型的继承创建了一个小示例。基本上有三种不同的类别: 主应用程序: BaseManager: 鸟经理: 当我重写方法以返回时,为什么我需要将类型转换为? 我使用过的重写方法在返回类型上会有所不同吗?作为参考。 编辑: 我有不同的子模型,它们都继承自。所有模型都允许存在一次。我尝试将这些模型添加到列表中,而不是对每个模型使用单例。使用,我想得到实际的模型。也许我得考虑太多了。

  • 问题内容: 我正在使用jackson库将JSON映射到对象中。我已经简化了问题 很多 ,这是发生了什么: 我正在解析一个空的JSON字符串: 在上,出现以下异常: 当我在类中有 两个 返回a的方法时,就会发生这种情况。删除其中一种方法不会导致异常。 实际上,我对映射器查看方法的事实感到惊讶,它应该设置我指示的字段。 这是怎么回事 问题答案: 我通过将转换为来解决此问题:

  • 我有一个特征Foo,具体类型a和B都由特征Foo限定。我想返回一个

  • 问题内容: 我正在玩Go,发现一个我无法解决的问题。假设我有如下代码: 我导入了软件包并开始使用它: 我真的很喜欢我的助手“运行”,但是我想使其更加慷慨:我不希望人们总是向我传递MySQL客户端。可以是具有“ RunQuery”和“ Result”方法的任何东西。所以我尝试使用接口: 可悲的是,这不再编译了。我收到此错误: Go不支持此功能吗,或者我做错了什么? 问题答案: 应该返回接口,否则你总

  • 问题内容: 背景 将列数据类型映射到其对应的Java类。 问题 查询从数据库返回元信息: 例如,此查询返回(自引用): 其中“ dictionary”是架构名称,“ resource_bundle”是object_name,“ column_name”是column_name。 要做类似的事情会很棒: 并返回以下查询: 然后使用JDBC发现已映射到。 问题 在PostgreSQL中,如何给定架构名