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

有没有一种方法可以在byteBuddy拦截方法中使用metodcall调用带有字段的可变长度参数方法?

昝存
2023-03-14

我试图使用bytebuddy返回一些字段作为列表。我打电话给数组。asList()使用MethodCall,但无法处理可变长度参数。还有其他方法吗?

public class TestClass {
    int a;
    int b;
    
    public List<?> getFields(){
        throw new RuntimeException("Bytebuddy not work.");
    }
}

new ByteBuddy()
                .rebase(TypePool.Default.ofSystemLoader().describe("com.test.TestClass").resolve(), 
                        ClassFileLocator.ForClassLoader.ofSystemLoader())
                .method(ElementMatchers.named("getFields"))
                .intercept(MethodCall.invoke(Arrays.class.getMethod("asList", Object[].class))
                        .withField("a", "b"))       
                .make()
                .load(ClassLoader.getSystemClassLoader(), ClassLoadingStrategy.Default.INJECTION)
                .getLoaded();
        
        TestClass testTarget = new TestClass();
        LOG.info("result : {}", testTarget.getFields());

错误:

线程“main”java中出现异常。lang.ExceptionInInitializerError由以下原因引起:java。IllegalStateException:公共静态java。util。列出java。util。数组。asList(java.lang.Object[])在net上不接受两个参数。拜特巴迪。实施方法调用$Appender。net上的toStackManipulation(MethodCall.java:3537)。拜特巴迪。实施方法调用$Appender。在net上应用(MethodCall.java:3506)。拜特巴迪。动态断头台打字机$MethodPool$记录$ForDefinedMethod$WithBody。net上的applyCode(TypeWriter.java:708)。拜特巴迪。动态断头台打字机$MethodPool$记录$ForDefinedMethod$WithBody。applyBody(TypeWriter.java:693)在net上。拜特巴迪。动态断头台打字机$MethodPool$记录$ForDefinedMethod。在net上应用(TypeWriter.java:600)。拜特巴迪。动态断头台打字机$Default$用于内联$WithFullProcessing$RedefinitionClassVisitor。onVisitEnd(TypeWriter.java:5022)位于net。拜特巴迪。公用事业来访者MetadataAwa是访客。visitEnd(MetadataAwareClassVisitor.java:323)位于net。拜特巴迪。罐子asm。学生。在net上接受(ClassReader.java:722)。拜特巴迪。罐子asm。学生。在net上接受(ClassReader.java:401)。拜特巴迪。动态断头台打字机$Default$用于内联。在net上创建(TypeWriter.java:3827)。拜特巴迪。动态断头台打字机$Default。make(TypeWriter.java:2166)在net上。拜特巴迪。动态断头台内联。RebaseDynamicTypeBuilder。make(rebedynamictypebuilder.java:252)在net上。拜特巴迪。动态断头台内联。AbstractIningDynamicTypeBuilder。在net上制作(AbstractInliningDynamicTypeBuilder.java:123)。拜特巴迪。动态DynamicType$Builder$AbstractBase。make(DynamicType.java:3595)在net上。拜特巴迪。动态DynamicType$Builder$AbstractBase$Delegator。make(DynamicType.java:3819)位于

共有1个答案

萧安怡
2023-03-14

在这种情况下,对于更复杂的方法体,我建议您Java编写代码,并使用MESTODENATIONADIVES在代码中解决问题,然后链接您的方法。

或者,您可以使用堆栈操作并从单个代码块构造方法。在这种情况下,需要先构造一个数组,然后将该数组提供给该方法,因为字节码级别上不存在varargs。

 类似资料:
  • 问题内容: 我正在编写小型且非常干燥的框架,该框架高度依赖元数据。我想知道是否有一种方法来获取方法参数名称,即给定一些方法 得到的字符串和。 我知道我可以注释参数,但是那不是很好。 问题答案: 我们为包含参数名称的String[]的方法创建了一个自定义注释。与必须注释每个单独的参数相比,此方法感觉易于管理。我们计划添加构建时检查,以确保带注释的参数名称的数量与参数的数量匹配,因为这是我们所需要的。

  • 问题内容: 嗨,我想使用WMI类来查找应用程序和产品信息。但是问题是我想使用Java或任何脚本语言(如python,javascript或perl)。我听说过JWMI,这可能是一个选择。有人可以帮我吗??? 问题答案: JavaScript和Java不是一回事。 JavaScript Windows脚本宿主(WSH)下提供了JavaScript。有了它,访问WMI相当容易: jWMI(Java)

  • 我只需要一个标题,味精和按钮警报对话框,但显示为底部工作表。 哪里有一种方法可以获得这个(没有自定义视图)?

  • 问题内容: 假设我有以下代码: 这段代码的问题在于,协程内部的循环永远不会完成第一次迭代,而大小会不断增加。 为什么会这样发生,我该怎么解决? 我无法摆脱单独的线程,因为在我的真实代码中,我使用了单独的线程与串行设备进行通信,而且我还没有找到使用的方法。 问题答案: 不是线程安全的,因此您不能直接在多个线程中直接使用它。相反,您可以使用,它是提供线程感知队列的第三方库: 还有(全披露:我写了它),

  • 问题内容: doIt函数将打印“ dad”。有没有办法让它打印“儿子”? 问题答案: 是。但是就变量而言,它会被覆盖(将新值赋予变量。将新定义赋予函数是Override)。 在父类的块中使用时,该值将得到反映 如果变量是静态的,则在初始化时使用静态块更改其值, 否则更改构造函数。 你还可以稍后在任何块中更改该值。它将反映在超一流

  • 问题内容: 我正在尝试使用java反射调用带有可变参数的方法。这是托管方法的类: 这是调用代码: 我在调用invoke的最后一行以“错误数量的参数” 的形式获取IllegalArgumentException 。不知道我在做什么 错。 任何指针将不胜感激。 谢谢 问题答案: public class Test { 为我工作。 将您的N []投射到对象 在实例上调用,而不在类上调用