




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第使用javassist動態生成類的配置代碼目錄說明:配置環境:使用javassist生成類:使用javassist生成類并實現接口:
說明:
Javassist(JAVA編程ASSISTant)使Java字節碼操作變得簡單。它是一個用Java編輯字節碼的類庫。它使Java程序能夠在運行時定義新類,并在JVM加載時修改類文件。與其他類似的字節碼編輯器不同,Javassist提供兩個級別的API:源級別和字節碼級別。如果用戶使用源級API,他們可以在不知道Java字節碼規范的情況下編輯類文件。整個API僅使用Java語言的詞匯表進行設計。您甚至可以以源文本的形式指定插入的字節碼;Javassist即時編譯它。另一方面,字節碼級API允許用戶直接編輯類文件作為其他編輯器。
配置環境:
javassist依賴:
dependency
groupIdorg.javassist/groupId
artifactIdjavassist/artifactId
version3.29.1-GA/version
/dependency
環境配置:
add-opensjava.base/java.lang=ALL-UNNAMED
add-opensjava.base/.util=ALL-UNNAMED
使用javassist生成類:
代碼:
packagecom.user;
importjavassist.*;
importjava.lang.reflect.Method;
publicclassJavassistTest{
publicstaticvoidmain(String[]args)throwsException{
//獲取類池
ClassPoolpool=ClassPool.getDefault();
//通過類路徑創建類
CtClassctClass=pool.makeClass("com.user.Test");
//為類創建方法(參數:1.方法返回值類型2.方法名3.方法形參列表4.方法所屬類)
CtMethodctMethod=newCtMethod(CtClass.voidType,"execute",newCtClass[]{},ctClass);
//設置方法的修飾符列表
ctMethod.setModifiers(Modifier.PUBLIC);
//設置方法體
ctMethod.setBody("{System.out.println(\"helloworld\");}");
//給類添加方法
ctClass.addMethod(ctMethod);
//測試:使用反射機制測試方法調用
ClassaClass=ctClass.toClass();
Objecto=aClass.newInstance();
Methodmethod=aClass.getDeclaredMethod("execute");
method.invoke(o);
}
執行結果:
使用javassist生成類并實現接口:
接口已定義好:
packagecom.user;
publicinterfaceDao{
publicintinsert();
publicintdelete();
publicintupdate();
publicvoidselect();
}
代碼:
packagecom.user;
importjavassist.*;
importjava.lang.reflect.Method;
importjava.util.Arrays;
publicclassJavassistTestImpl{
publicstaticvoidmain(String[]args)throwsException{
//獲取類池
ClassPoolpool=ClassPool.getDefault();
//制造類
CtClassctClass=pool.makeClass("com.user.TestImpl");
//制造接口
CtClassctInterface=pool.makeInterface("com.user.Dao");
//類實現接口
ctClass.addInterface(ctInterface);
//獲取接口中的所有方法
Method[]methods=Dao.class.getDeclaredMethods();
//類實現接口中的所有方法
Arrays.stream(methods).forEach(method-{
try{
//拼接方法頭+方法體
StringBuildersb=newStringBuilder();
sb.append("public");//方法修飾符
sb.append("");
sb.append(method.getReturnType().getName());//方法返回值類型
sb.append("");
sb.append(method.getName());//方法名
sb.append("(");
Class[]parameterTypes=method.getParameterTypes();
for(inti=0;iparameterTypes.length;i++){
sb.append(parameterTypes[i].getName());//參數類型
sb.append("");
sb.append("arg"+i);//參數名,隨意指定,但不能重名
if(i!=parameterTypes.length-1){
sb.append(",");
sb.append(")");
sb.append("{");
StringsimpleName=method.getReturnType().getSimpleName();//根據返回值類型寫return語句
if("String".equals(simpleName)){
sb.append("return\"hello\";");
}elseif("int".equals(simpleName)){
sb.append("return1;");
}elseif("void".equals(simpleName)){
sb.append("System.out.println(\"hello\");");
sb.append("}");
//創建方法(參數:方法頭+方法體,所屬類)
CtMethodctMethod=CtNewMethod.make(sb.toString(),ctClass);
ctClass.addMethod(ctMethod);
}catch(CannotCompileExceptione)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市級語文教研組年度工作計劃
- 新外研版五年級上冊英語學習反饋計劃
- 工業車間離心式排風機施工方案及技術措施
- 交通運輸質量保證技術措施
- 七年級英語下冊作文范例與解析范文
- 荒山造林項目施工安全質量保證措施
- 幼兒園教科研工作績效考核計劃
- 綠色護理服務推廣計劃
- 部編版二年級下冊語文園地四寫話思維訓練范文
- 小學班主任學科教學培訓心得體會他
- 初三第一學期家長會
- 2022-2023學年天津市北辰區八年級(下)期末語文試卷
- 位置隨動系統的MATLAB計算及仿真畢業設計說明書
- 辦公樓裝飾裝修工程施工組織設計方案
- 勞務合同保證金合同模板
- 湖南省長沙市2024年中考語文真題試卷(含答案)
- 污水管網工程竣工驗收報告
- DB34∕ 1659-2022住宅工程質量常見問題防治技術規程
- 2023-2024學年安徽省安慶市高二(下)期末考試物理試卷(含答案)
- 安全文明施工和環境保護措施
- 單證員崗位說明書
評論
0/150
提交評論