2017-02-15 12 views
0

커스텀 애노테이션에 의해 주석이 달린 클래스와 메소드를 변형/수정하는 방법이 있습니까? # bytecode-manipulation (덱스 용)주석에 의한 클래스/메소드 변환

가장 좋은 방법은 무엇입니까?

프록시는 내가 찾는 것을 위해이 아닌 적절한 방법입니다.

답변

0

덱스 파일 기반 조작이 가능하지만 매우 복잡하고 좋은 툴링이 거의 없습니다.

대신 클래스 파일로 표시 될 때 빌드 중에 코드를 계측해야합니다. 이를위한 다양한 도구가 있습니다. 나는 Maven이나 Gradle 플러그인을 사용하여 빌드하는 동안 코드를 실행할 수있는 Byte Buddy이라는 도구를 작성했습니다.

클래스를 변경하려면 변경할 클래스와 변경 방법을 지정할 수있는 라이브러리의 Plugin 인터페이스를 구현해야합니다. Byte Buddy는 모든 클래스를 인라인하여 런타임 프록시를 만들 필요가 없습니다.

configuration { 
    myPlugin 
} 
dependencies { 
    myPlugin "my:plugin:1.0" 
} 
byteBuddy { 
    transformation { 
    plugin "pkg.MyPluginImpl" 
    classpath configuration.myPlugin 
    } 
} 

내가 그건 당신이 안드로이드 개발을주고 무엇을 사용 가정 : Gradle을 들어

, 당신은 당신의 플러그인 코드를 참조하는 구성을 만들어야합니다.

+0

라이브러리 모듈에서도이 작업을 수행하는 방법은 무엇입니까? 기본 앱 프로젝트의 클래스 만 변형됩니다. – Reymanx

+0

불행히도 불가능합니다. 라이브러리는 배포 된 이슈의 일부가 아닙니다. 다시 작성해야합니다. 또는 런타임에 Java 에이전트를 사용해야합니다 (Android에서는 불가능 함). –