1. 程式人生 > >javassist----動態修改註解

javassist----動態修改註解

1、為什麼要動態修改註解?

@Table(name = "pay_flow")
public class PayFlowDB {
    @Id(insertable = true)
    @Column(name = "id")
    private Long    id;
為了方便進行資料庫操作和轉換,在實體中加入註解來標示table_name和對應的field_name。通過註解大大減少了dao層的程式碼量。具體實體如上。

同時問題也來了?

分表的資料結構

由於資料庫層面進行分表,導致table_name會不一樣,但是對應的其他屬性和欄位都是一樣的。如果如下進行手動新增對應的實體,很明顯是無法接受的。

@Table(name = "pay_flow1")
public class PayFlowDB1 {
    @Id(insertable = true)
    @Column(name = "id")
    private Long    id;
@Table(name = "pay_flow2")
public class PayFlowDB2 {
    @Id(insertable = true)
    @Column(name = "id")
    private Long    id;

這個時候就需要動態修改註解的name屬性

2、怎樣利用jdk已有的api進行動態修改?

具體見如下程式碼

// 動態修改註解部分程式碼

// 從實現的角度說,ClassPool是一個CtClass物件的hash表,類名做為key。ClassPool的get()搜尋hash表找到與指定key關聯的CtClass物件。
ClassPool classPool = ClassPool.getDefault();
classPool.appendClassPath(new ClassClassPath(ClassPoolUtils.class));
// 如果CtClass通過writeFile(),toClass(),toBytecode()轉換了類檔案,javassist凍結了CtClass物件。
// 以後是不允許修改這個 CtClass物件。這是為了警告開發人員當他們試圖修改一個類檔案時,已經被JVM載入的類不允許被重新載入。 CtClass clazz = classPool.get(entityClassName); clazz.stopPruning(true); // Defrost()執行後,CtClass物件將可以再次修改。 clazz.defrost(); ClassFile classFile = clazz.getClassFile(); ConstPool constPool = classFile.getConstPool(); Annotation tableAnnotation = new Annotation(annotationName, constPool); tableAnnotation.addMemberValue("name", new StringMemberValue(tableName, constPool)); // 獲取執行時註解屬性 AnnotationsAttribute attribute = (AnnotationsAttribute) classFile.getAttribute(AnnotationsAttribute.visibleTag); attribute.addAnnotation(tableAnnotation); classFile.addAttribute(attribute); classFile.setVersionToJava5(); // 當前ClassLoader中必須尚未載入該實體。(同一個ClassLoader載入同一個類只會載入一次) EntityClassLoader loader = new EntityClassLoader(ClassPoolUtils.class.getClassLoader()); c = clazz.toClass(loader, null);

//該載入器主要用於執行時動態修改實體後,重新裝載實體

public class EntityClassLoader extends ClassLoader {

    private ClassLoader parent;
EntityClassLoader(ClassLoader parent) {
        this.parent = parent;
}

    @Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
        return this.loadClass(name, false);
}

    @Override
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        Class<?> clazz = this.findLoadedClass(name);
        if (null != parent)
            clazz = parent.loadClass(name);
        if (null == clazz)
            this.findSystemClass(name);
        if (null == clazz)
            throw new ClassNotFoundException();
        if (resolve)
            this.resolveClass(clazz);        return clazz;
}
}

相關推薦

JAVAssist---動態修改註解

@Test public void UpdateTest() throws NotFoundException{ ClassPool pool = ClassPool.getDefault(); //獲取需要修改的類 CtClass ct = pool.get("co

javassist----動態修改註解

1、為什麼要動態修改註解? @Table(name = "pay_flow") public class PayFlowDB { @Id(insertable = true) @Column(name = "id") private Long

[Java] 通過反射,動態修改註解的某個屬性值

昨晚看到一條問題,大意是樓主希望可以動態得建立多個Spring 的定時任務。這個題目我並不是很熟悉,不過根據題目描述和查閱相關 Spring 建立定時任務 的資料,發現這也許涉及到通過Java程式碼動態修改註解的屬性值。今天對此嘗試了一番,發現通過反射來動態修改註解的屬性值是

Java反射動態修改註解的值

先來看看通常情況下,我們通過反射獲取註解的值的場景:那麼現在我們定義一個 @Foo 註解,它有一個型別為 String 的 value 屬性,該註解應用再Field上:/** * @Author 落葉飛翔的蝸牛 * @Date 2018/3/11 * @Descript

JavaScript動態修改html組件form的action屬性

jsp頁面 check javascrip user validate -h jsp ida == 用javaScript動態修改html組件form的action屬性,可以在提交時再決定處理表單的頁面。 <%--JavaScript部分--%><sc

動態修改settings

技術分享 cnblogs 分享 blog tin images studio png log ide visual studio2010 註意範圍是用戶 註意改完要save動態修改settings

OSG立體模式下動態修改相機遠近裁剪面的實現

void base call struct clam ppr cti llc 源代碼 1. 非立體模式下動態修改相機遠近裁剪面 class GLB_DLLCLASS_EXPORT CGlbGlobeClipHandler : public osg::NodeCallbac

Js 添加動態修改id

input ace htm table tr roo net [0 oom html //HTML代碼 <table id="templateTable" > <tr>

動態修改easyui-datagrid 列

csharp eas blog 動態修改 field grid datagrid htm 查詢 <table id="DataList" title="查詢結果" style="width:99%;padding:10px;"></table>

Easyui Datagrid 的Combobox 如何動態修改下拉選項,以及值的轉換

options 解釋 logs sel onclick med rsize rip 原因 我是先將下拉選項的值通過datagrid的url查出來了,在每一行的row中 //項目結果選項卡的列表 $(‘#project_table‘).datagrid({

angular 動態修改 ng-bind-html

alt -h ng- logs 修改 src -html html log angular 動態修改 ng-bind-html

獲取WebView加載的網頁內容並進行動態修改

datawit cli cap jsoup 動態修改 成功 scale 技術 parse http://www.jianshu.com/p/3f207a8e32cb 【Android】WebView讀取本地圖片 http://www.cnblogs.com/kimmy/p/

微信瀏覽器下動態修改 微信title

avi 動態 cti end 動態修改 settime icon var nbsp var $body = $(‘body‘); document.title = ‘title’ // hack在微信等webview中無法修改document.title的情況

newtonsoft動態修改JObject

動態 mob 動態添加 num 添加 any span newton 修改 直接上代碼: var data = new { mobile = "18888888888",

對封裝好的視圖進行動態修改

animate let sub sta setimage tap mat smis navi [self.KVOController observe:vc keyPath:@"self.view" options:NSKeyValueObservingOptionInit

VUE動態修改title

不同的 pan 進行 chat 實現 生成 設置 div app 首先安裝 vue-wechat-title 模塊 然後引入到你的入口文件中並進行使用 其次在路由的那個文件中根據不同的路由來設置title 最後在你的App.vye裏面來實現它 好啦 一個動態的

Hibernate動態修改數據設計

seda gets 請求 alt ets .com 執行 ajax get Hibernate動態修改數據 在dao層用可變數組 在xxx.hbm.xml中配置query標簽,參數name就是queryName的名稱 在service層中getTele沒有執行queryN

SpringBoot系列十一:SpringBoot整合Restful架構(使用 RestTemplate 模版實現 Rest 服務調用、Swagger 集成、動態修改日誌級別)

attribute tar ring 動態修改 包含 分布式 restfu pen 負載 1、概念:SpringBoot整合Restful架構 2、背景 Spring 與 Restful 整合才是微架構的核心,雖然在整個 SpringBoot(SpringCloud)之中提

如何做到在webpack打包vue項目後,在外部動態修改配置文件

打包 測試 contex 我們 pro nbsp assets bpa gen 在我們做完vue項目後,只需要執行 npm run dist 就可以輕松進行打包轉測試,可是如果我們臨時需要修改一些配置文件比如域名,這時候我們就有點懵逼了,那就修改了再重新打一次包? NO N

微信小程序動態修改頁面標題setNavigationBarTitle

attribute str 你好 function tle let 頁面切換 ready spa 1、可以在對應的json文件裏面寫: {   "navigationBarTitleText": "你好" } 但是這個問題有bug,在點擊切換的時候,立馬更改了title,