Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于将新创建的对象传递给方法的字节代码_Java_Jvm_Byte Buddy_Jvm Bytecode - Fatal编程技术网

Java 用于将新创建的对象传递给方法的字节代码

Java 用于将新创建的对象传递给方法的字节代码,java,jvm,byte-buddy,jvm-bytecode,Java,Jvm,Byte Buddy,Jvm Bytecode,所以,我试图用Byte Buddy生成一些相对简单的代码,但我一直遇到异常 基本上,我正在尝试让Byte Buddy(版本1.9.0)生成以下Java类的等价物(这只是一个简化的示例;问题通常发生在尝试将新创建的对象传递给方法时): 我提出的Byte-Buddy代码如下(使用语法,但与Java非常接近): 调试器中的进一步探索表明,这是由于Date的构造函数(与所有构造函数一样)的返回类型为void,这反过来又与java.util.Date不兼容。Byte Buddy的VoidAwareAssi

所以,我试图用Byte Buddy生成一些相对简单的代码,但我一直遇到异常

基本上,我正在尝试让Byte Buddy(版本1.9.0)生成以下Java类的等价物(这只是一个简化的示例;问题通常发生在尝试将新创建的对象传递给方法时):

我提出的Byte-Buddy代码如下(使用语法,但与Java非常接近):

调试器中的进一步探索表明,这是由于
Date
的构造函数(与所有构造函数一样)的返回类型为
void
,这反过来又与
java.util.Date
不兼容。Byte Buddy的
VoidAwareAssigner
生成非法的
堆栈操纵
,因为源类型为
void
,而目标类型为非
void
,并且
键入
不是动态的。 我希望
voidawarearelassigner
确实应该知道构造函数本质上是
void
方法,但我可能在这里遗漏了一些其他东西

在Byte Buddy中将新创建的对象作为方法参数传递的正确方式是什么

更新:我可以通过添加
.withAssigner(custom,Typing.DYNAMIC)
和一个始终返回
StackManipulation.Triple
的自定义“普通”
赋值器来避免异常。此解决方案产生看似正确(且有效)的字节码:

public class CalendarSetter {
  public void setCalendarTime(java.util.Calendar);
    Code:
       0: aload_1
       1: new           #8                  // class java/util/Date
       4: dup
       5: invokespecial #12                 // Method java/util/Date."<init>":()V
       8: invokevirtual #18                 // Method java/util/Calendar.setTime:(Ljava/util/Date;)V
      11: return
...
公共类日历设置程序{
public void setCalendarTime(java.util.Calendar);
代码:
0:aload_1
1:new#8//class java/util/Date
4:dup
5:invokespecial#12//方法java/util/Date。“:()V
8:invokevirtual#18//方法java/util/Calendar.setTime:(Ljava/util/Date;)V
11:返回
...

然而,我仍然觉得这不是正确的方法,可能过于简化了一些我不知道的场景…

您发现了一个我刚刚在主分支上修复的错误。它将是1.10.12版本的一部分

Byte Buddy错误地将构造函数的返回类型解析为void

  val Builder<?> builder = new ByteBuddy()
    .subclass(Object).name("CalendarSetter").merge(Visibility.PUBLIC)
    .defineMethod("setCalendarTime", void, Visibility.PUBLIC)
    .withParameter(Calendar)
    .intercept(MethodCall.invoke(new ForLoadedMethod(Calendar.getDeclaredMethod("setTime", Date)))
      .onArgument(0)
      .withMethodCall(MethodCall.construct(Date.getConstructor)))
  builder.make.load(class.classLoader).loaded
java.lang.IllegalStateException: Cannot assign public java.util.Date() to java.util.Date arg0
    at net.bytebuddy.implementation.MethodCall$ArgumentLoader$ForMethodCall.resolve(MethodCall.java:1470)
    at net.bytebuddy.implementation.MethodCall.toStackManipulation(MethodCall.java:2397)
    at net.bytebuddy.implementation.MethodCall$Appender.apply(MethodCall.java:2434)
    at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyCode(TypeWriter.java:698)
    ...
public class CalendarSetter {
  public void setCalendarTime(java.util.Calendar);
    Code:
       0: aload_1
       1: new           #8                  // class java/util/Date
       4: dup
       5: invokespecial #12                 // Method java/util/Date."<init>":()V
       8: invokevirtual #18                 // Method java/util/Calendar.setTime:(Ljava/util/Date;)V
      11: return
...