2017-02-04 12 views
0

저는 보일러 플레이트 방법을 자동 생성하는 데 관심이 있습니다 (Project Lombok과 비슷 함). Byte Buddy friendly API는 유망한 것으로 보이지만 사용법을 잘 모르겠습니다.필드 생성 방법 자동 생성

간단한 사용 사례입니다. 나는 이것에 대한 getter와 setter를 생성 구현을했을 주석이 클래스를 장식 할 계획입니다

public class User { 
    private String name; 
} 

클래스 User.java가 있다고 할 수 있습니다. 나는 예외를

Exception in thread "main" java.lang.NoSuchMethodException: scratchpad.User$ByteBuddy$n0KYCYB5.setName() 
    at java.lang.Class.getDeclaredMethod(Class.java:2130) 
    at scratchpad.MethodInterceptor.main(MethodInterceptor.java:22) 

주를 얻고, 그러나

public class MethodInterceptor { 

    public static void main(String[] args) throws Exception { 

     User user = new ByteBuddy() 
       .subclass(User.class)    
       .defineMethod("getName", String.class, Visibility.PUBLIC) 
       .intercept(FieldAccessor.ofBeanProperty()) 
       .defineMethod("setName", Void.TYPE, Visibility.PUBLIC) 
       .withParameter(String.class) 
       .intercept(FieldAccessor.ofBeanProperty())    
       .make() 
       .load(User.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) 
       .getLoaded().newInstance(); 

     user.getClass().getDeclaredMethod("setName").invoke("Jaypal"); 
     Method m = user.getClass().getDeclaredMethod("getName"); 

     System.out.println((String) m.invoke(null)); 
    } 
} 

: 바이트 버디를 사용하여, 나는 다음을 시도 내가 프로젝트 롬복이를 지원하지 않습니다 알고, 그러나 이것은 단지 실험이다. 다른 프로젝트의 주석 생성 코드 생성에 더 관심이 있습니다. 이것은 Byte Buddy가 그러한 사용 사례에 적합한 지 알아보기 위해 노력하고있는 간단한 예입니다.

도움이나 안내 사항을 보내 주시면 감사하겠습니다.

builder.defineMethod("setName", Void.TYPE, Visibility.PUBLIC) 
     .withParameter(String.class) 

를 통해 방법을 선언함으로써

답변

1

당신은 당신은 매개 변수 유형을 추가하는 것을 잊었다

Method method = clazz.getDeclaredMethod("setName", String.class); 

를 통해

public void setName(String s); 

이 방법을 사용할 수있는 방법을 선언한다.

+0

오 ~. 미안합니다. 그러나 ByteBuddy에서 작성한 아름다운 라이브러리가 무엇인지 말해야합니다. 정말 고맙습니다! –

+0

런타임에 생성하는 메서드에 대해 컴파일 타임 검사를 무시하는 방법은 무엇입니까? 내가 뭘하려고 애 쓰고 런타임에 주석을 기반으로 메서드를 만드는 필드를 주석입니다. 그러나, 나는 내 테스트가 그 방법을 사용하고 싶지만 컴파일러는 아직 정의되지 않았기 때문에 방해가된다. 추가 질문을 코멘트로 올리는 것에 사과드립니다. –