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,