是否有一种方法来调用一个可变长度的参数方法与一个字段使用方法调用在字节巴迪拦截方法?



我试图使用bytebuddy返回一些字段作为列表。我使用MethodCall调用Arrays.asList(),但是它不能处理可变长度的参数。还有其他方法吗?

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.ExceptionInInitializerErrorjava.util. array . aslist (java.lang.Object[])不接受2个参数net.bytebuddy.implementation.MethodCall Appender.toStackManipulation美元(MethodCall.java: 3537)net.bytebuddy.implementation.MethodCall Appender.apply美元(MethodCall.java: 3506)在net.bytebuddy.dynamic.scaffold.TypeWriter MethodPool记录ForDefinedMethod WithBody.applyCode美元美元(TypeWriter.java: 708)在net.bytebuddy.dynamic.scaffold.TypeWriter MethodPool记录ForDefinedMethod WithBody.applyBody美元美元(TypeWriter.java: 693)在net.bytebuddy.dynamic.scaffold.TypeWriter MethodPool ForDefinedMethod.apply美元美元(TypeWriter.java: 600)在net.bytebuddy.dynamic.scaffold.TypeWriter默认ForInlining美元WithFullProcessing RedefinitionClassVisitor.onVisitEnd美元(TypeWriter.java: 5022)net.bytebuddy.utility.visitor.MetadataAwareClassVisitor.visitEnd (MetadataAwareClassVisitor.java: 323)net.bytebuddy.jar.asm.ClassReader.accept (ClassReader.java: 722)net.bytebuddy.jar.asm.ClassReader.accept (ClassReader.java: 401)在net.bytebuddy.dynamic.scaffold.TypeWriter默认ForInlining.create美元(TypeWriter.java: 3827)net.bytebuddy.dynamic.scaffold.TypeWriter Default.make美元(TypeWriter.java: 2166)net.bytebuddy.dynamic.scaffold.inline.RebaseDynamicTypeBuilder.make (RebaseDynamicTypeBuilder.java: 252)net.bytebuddy.dynamic.scaffold.inline.AbstractInliningDynamicTypeBuilder.make (AbstractInliningDynamicTypeBuilder.java: 123)在net.bytebuddy.dynamic.DynamicType Builder AbstractBase.make美元(DynamicType.java: 3595)net.bytebuddy.dynamic.DynamicType Builder AbstractBase Delegator.make美元美元(DynamicType.java: 3819)在

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

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

相关内容

  • 没有找到相关文章

最新更新