激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Eclipse下Javassist正確使用方法代碼解析

Eclipse下Javassist正確使用方法代碼解析

2021-03-09 13:25三向板磚 Java教程

這篇文章主要介紹了Eclipse下Javassist正確使用方法代碼解析,javassist-3.15.0-ga.jar包是一款在java開發(fā)中十分重要的jar文件包,需要的朋友可以參考下,文中附下載鏈接。

這兩天看到Hibernate的代理部分,第一反應是底層使用了反射,針對用戶實體生成了代理類,后來反應過來了,反射沒有任何可以產(chǎn)生新類的能力,也就順理成章地找到了Javassist

在網(wǎng)上搜索到的大部分教程,都是針對Javassist的API進行一番講解,但是最后,往往沒有一個加載過程,而筆者模仿這些教程進行類的加載時,加載到的結果都是原來的類,并沒有產(chǎn)生字節(jié)碼被修改的內(nèi)容。

在經(jīng)過一番探索后,筆者發(fā)現(xiàn),網(wǎng)上的大部分教程中的最后一步,保存字節(jié)碼,使用的均是writeFile的無參數(shù)重載,在查看其函數(shù)結構后發(fā)現(xiàn),它還有一個String類型的重載,由于在Eclipse下,字節(jié)碼儲存的根位置并不是”.\\”而是”.\\bin”,而writeFile的另一個重載很可能是指定字節(jié)碼根位置的參數(shù),筆者進行一番更改后發(fā)現(xiàn),果不其然。

下面將演示代碼分享出來:

這是筆者項目的結構:

Eclipse下Javassist正確使用方法代碼解析

?
1
2
3
4
5
6
7
8
Editable.java:
package com.thrblock.javassist;
  
public class Editable {
   public void showInfo(){
       System.out.println("InfoDefault!");
   }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Main.java:
package com.thrblock.javassist;
import java.io.IOException;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
public class Main {
    public static void main(String[] args) {
        ClassPool pool = ClassPool.getDefault();
        try{
            pool.insertClassPath(".\\bin");
            //設置根路徑。(這里設置的根路徑顯然沒被writeFile使用)
            CtClass cc = pool.makeClass("com.thrblock.javassist.EditableChanged");
            //模擬Hibernate代理模式,我們創(chuàng)建一個新類
            cc.setSuperclass(pool.get("com.thrblock.javassist.Editable"));
            //設置其父類
            CtMethodcm = CtNewMethod.make("public void showInfo(){super.showInfo();System.out.println(\"CustomInsertHAHA!\");}",cc);
            //追加一個方法,注意它覆蓋了父類中的方法。
            cc.addMethod(cm);
            cc.writeFile(".\\bin");
            //這里比較重要,空參的結果就是沒有保存到eclipse字節(jié)碼根路徑里。
        }
        catch (NotFoundException | CannotCompileException | IOException e) {
            e.printStackTrace();
        }
        try{
            Class<?> cl = Class.forName("com.thrblock.javassist.EditableChanged");
            //加載我們的新類
            Editableed = (Editable) cl.newInstance();
            //由于其繼承與Editable類,這里和Hibernate里的load道理一樣。
            ed.showInfo();
            //調(diào)用方法。
        }
        catch (ClassNotFoundException | InstantiationException |IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

打印結果:

InfoDefault!

CustomInsertHAHA!

其他注意事項:

由于我們是生成了一個類,如果這個類名和原類名一樣,則會覆蓋class文件,但是如果修改之前該class已經(jīng)被JVM裝入,則修改的部分不會生效,必須重啟JVM。

總結

以上就是本文關于Eclipse下Javassist正確使用方法代碼解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/shuzhe66/article/details/39319121

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产资源视频在线观看 | 91久久久久久久 | 精品中文字幕久久久久四十五十骆 | 欧美一级做一a做片性视频 黄色网址免费进入 | 亚洲第一男人天堂 | h视频在线播放 | 国产精品久久久久久模特 | 精品久久久久久国产三级 | 播色网电影网 | 久久精品资源 | 一级免费大片 | 97香蕉超级碰碰久久免费软件 | 爱性久久久久久久 | 亚洲精品久久久久久久久久久 | 亚洲视频在线一区二区 | 12av毛片 | 成人午夜免费福利 | 国产精品免费小视频 | 欧美国产第一页 | 欧美一级理论 | 学霸趴下被打肿光屁股小说 | 日韩av片网站 | 成人在线观看一区二区 | 欧美成人久久 | 美女视频在线观看黄 | 久久久久久久一区二区 | 夜班护士在线观看 | 亚洲伊人色欲综合网 | 天天看逼 | 日本高清黄色片 | 欧洲精品久久久久69精品 | 欧美黄色免费视频 | 欧美一级毛片欧美一级成人毛片 | 久久久三级免费电影 | 久久国产成人午夜av浪潮 | 黄色大片网站在线观看 | 欧美激情天堂 | 666sao| 一级黄色片在线看 | 九七在线视频 | 粉嫩粉嫩一区二区三区在线播放 |