2016-01-18 71 views
1

我想實現這個第三方註釋來映射我的類的字段/屬性到我的數據庫表列。我可以在編譯時輕鬆實現註釋(如下面的示例代碼所示),但我無法找到在運行時執行此操作的方法。 (我使用反射在運行時加載庫)Can Byte Buddy可以在運行時創建字段和方法註釋嗎?

我的問題是如何在運行時加載庫時實現相同的映射註釋?可以Byte Buddy爲Android處理此問題嗎?

//3rd party annotation code 
package weborb.service; 

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD, ElementType.METHOD}) 
public @interface MapToProperty { 
    String property(); 
} 

/////////////////////// //////////

//Here is the implementation using non-reflection 
import weborb.service; 
    Class Person 
    { 
     @MapToProperty(property="Person_Name") 
     String name; 

     @MapToProperty(property="Person_Age") 
     int age; 

     @MaptoProperty(property="Person_Name") 
     public String getName() 
     { 
      return this.name; 
     } 

     @MaptoProperty(property="Person_Name") 
     public void setName(String name) 
     { 
      this.name = name; 
     } 

     @MaptoProperty(property="Person_Age") 
     public int getAge() 
     { 
      return this.age; 
     } 

     @MaptoProperty(property="Person_Age") 
     public void setAge(int age) 
     { 
      this.age = age; 
     } 
    } 

回答

1

是的,詳情請參閱the Annotations section of the documentation

可以使用AnnotationDescription.Builder通過建立的註釋:

AnnotationDescription.Builder.ofType(MapToProperty.class) 
          .define("property", "<value>") 
          .build(); 

所得AnnotationDescription可以被提供給動態型助洗劑作爲參數:

new ByteBuddy() 
    .subclass(Object.class) 
    .defineField("foo", Void.class) 
    .annotateField(annotationDescription) 
    .make(); 

類似地,它適用於方法。

+0

班級人 { String name; int age; public String getName() { return this.name; (字符串名) { this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } – Key

+0

謝謝。我可以使用類似的方法在運行時在現有類上添加註釋嗎?我使用的是Byte-Buddy,Byte-Buddy-Android和dx。 – Key

+0

理論上,是的,但Android並未實現Java的檢測API。因此,只有將類文件嵌入到應用程序中,並且修改後的類由新的類加載器加載時纔有可能。 –

相關問題