>source

메소드 참조를 다른 메소드의 인수로 전달하는 클래스의 바이트 code를 생성하고 싶습니다. 예를 들어,

public class GeneratedClass {
    public GeneratedClass() {
        Test.foo((Function)Test::getId)
    }
}

bytebuddy 사용 i 사용자 정의 생성자를 사용하여 클래스를 생성하고호출학그를 대표하는 것테스트 :: GetID.그러나 문제는 내가 통과 할 수 없다는 것입니다.호출학My.의 매개 변수로메서드 콜...에 내 현재 구현은 다음과 같습니다.

var fooMethod= Test.class.getMethod("foo",Function.class);
InvokeDynamic methodRef= InvokeDynamic.lambda(Test.class.getMethod("getId"), Function.class)
        .withoutArguments();
new ByteBuddy()
        .subclass(Object.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)
        .name("GeneratedClass")
        .defineConstructor(Visibility.PUBLIC)
        .intercept(
                MethodCall.invoke(fooMethod)
                .with((Object)null) \\I want to pass the methodRef instead of null
                .andThen(methodRef)
        ).make()
        .saveIn(new File("target"));

다음을 생성합니다.

public class GeneratedClass {
    public GeneratedClass() {
        Test.foo((Function)null);
        Test::getId;
    }
}

같은 질문, 문서 없음

Amin2021-05-12 06:47:59
  • 답변 # 1

    오늘 현재 DSL에서는 지원되지 않지만 사용자 정의를 제공 할 수 있습니다.stackanipulation.논쟁으로서...에 귀하의 경우에 귀하는 귀하가 해결해야합니다.methodinvocation.이것을 위해.

    약간의 트릭을 사용하면 오늘이 작업을 수행 할 수 있지만 도우미 방법을 만드십시오.

    builder= builder
      .defineMethod("mylambda", Function.class, Visibility.PRIVATE, Ownership.STATIC)
      .intercept(methodRef)
    

    다음을 사용 하여이 메서드를 호출 할 수 있습니다.메서드 콜그것을 논쟁으로 전달하십시오.

    당신의 답변에 감사드립니다! 문서를 읽고 스택 메이 짓을 사용하여 수행하는 방법을 알아낼 수 없으므로 code 예제를 생성 하시겠습니까?

    Rasoul2021-05-11 13:12:14
  • 이전 javascript : 나는 선택 가능한 데이얼리스트와 입력 태그가있는 자바 스크립트 파일이있는 PHP 파일을 가지고 있으며, 데이터리스트 너비가 너무 짧기 때문에 다른 것을 사용할 수 있습니까?
  • 다음 Linux Python 각 폴더의 모든 파일을 현재 날짜 + 시간으로 내 폴더 백업으로 백업하고 싶습니다.