我使用Scala作爲我的語言。我使用Google Objectify作爲持久性API來將對象存儲到Google App Engine的數據存儲中。任何要通過Objectify存儲在Google App Engine數據存儲中的類都必須在該類的前面添加一個@Entity註釋。您通常將此註釋應用於您自己的類,以便在您自己的應用程序或域中使用。在我的一個類中,我希望能夠定義一個類型爲Option [String]的類屬性。爲了做到這一點,我需要能夠將@Entity或@Subclass註解(Objectify註釋)應用於Option類。但是這是一種內置的Scala語言類型。有沒有辦法使用隱式類或類型或Scala宏來對語言進行「猴子修補」,以允許我在事後將該註釋添加到內置的Scala語言類型中?是否有可能使用註釋來修補scala final class?
0
A
回答
0
最簡單的解決方案是定義您自己的類,相當於Option
和隱式轉換從/到Option
。否則,在Scala本身中沒有辦法這樣做,但是您可以使用字節碼操作庫之一,如ASM或Javassist。有一個爲ASM here(但似乎不完整)動態添加註釋的示例,另一個用於Javassist here。 Javassist似乎更容易使用(不翻譯爲斯卡拉,但它是微不足道的):
import java.lang.reflect.Field;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.bytecode.AnnotationsAttribute;
import javassist.bytecode.ClassFile;
import javassist.bytecode.ConstPool;
import javassist.bytecode.annotation.Annotation;
public class AddingAnnotationDynamically {
public static void main(String[] args) throws Exception {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("scala.Option");
// Without the call to "makePackage()", package information is lost
cp.makePackage(cp.getClassLoader(), pkgName);
ClassFile cfile = cc.getClassFile();
ConstPool cpool = cfile.getConstPool();
AnnotationsAttribute attr =
new AnnotationsAttribute(cpool, AnnotationsAttribute.visibleTag);
Annotation annot = new Annotation(annotationName, cpool);
attr.addAnnotation(annot);
cfile.addAttribute(attr);
// Changes are not persisted without a call to "toClass()"
Class<?> c = cc.toClass();
}
}
相關問題
- 1. 是否可以在scala中註釋lambda?
- 2. 是否有可能調整註釋ti.map
- 3. 是否有可能將Spring MVC與Jersey註釋一起使用?
- 4. 是否有可能不使用數據註釋屬性ServiceStack OrmLite?
- 5. 是否有可能實例化Java註釋給定Class <?擴展Annotation>?
- 6. 是否有可能修補羣集SQL Server沒有BizTalk中斷?
- 7. 在Notepad ++中是否有修補補丁插件來修補文件?
- 8. 是否有API修補POJO?
- 9. 是否有可能在Java中進行修補?
- 10. 是否可以使用註釋來連接Spring MVC攔截器?
- 11. 是否可以使用jpa1 @notnull註釋?
- 12. 是否有可能在運行中修補dotnet函數
- 13. 是否有可能使@Formula註釋延遲加載?
- 14. 是否有可能在lambda體或匿名類中使用不是有效的final或final變量?
- 15. 是否有可能加入聯註釋用Cobol
- 16. 是否有可能在Java 9中註釋lambda表達式?
- 17. 是否有可能禁止註釋繼承?
- 18. 是否有可能在R中有多行註釋?
- 19. 是否有可能使用scala sbt構建工具使用butterknife?
- 20. 是否有可能在C#中繼承數據註釋?
- 21. 是否可以使用AngularJS進行網頁修補?
- 22. 是否有任何Java庫使用註釋來生成代碼?
- 23. 是否有可能訪問JSP中的方法註釋
- 24. @Autowired註釋是否正確使用?
- 25. 使用註釋來解釋Javascript中的函數是否「安全」?
- 26. 註釋後可以使用註釋來調用方法嗎?
- 27. 是否有可能與guice一起使用scala自我類型?
- 28. final Class和Class有什麼區別?
- 29. 是否有可能掃描Android類路徑的註釋?
- 30. 是否有可能讓SBT尊重Scalatest的DoNoDiscover註釋?
謝謝。我會嘗試你的第一個建議。 – bjenkins001