欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2017年12月21日 10:43:46   作者:三向板磚  
這篇文章主要介紹了Eclipse下Javassist正確使用方法代碼解析,javassist-3.15.0-ga.jar包是一款在java開(kāi)發(fā)中十分重要的jar文件包,需要的朋友可以參考下,文中附下載鏈接。

這兩天看到Hibernate的代理部分,第一反應(yīng)是底層使用了反射,針對(duì)用戶(hù)實(shí)體生成了代理類(lèi),后來(lái)反應(yīng)過(guò)來(lái)了,反射沒(méi)有任何可以產(chǎn)生新類(lèi)的能力,也就順理成章地找到了Javassist(下載地址)。

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

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

下面將演示代碼分享出來(lái):

這是筆者項(xiàng)目的結(jié)構(gòu):

Editable.java: 
package com.thrblock.javassist; 
  
public class Editable { 
   public void showInfo(){ 
       System.out.println("InfoDefault!"); 
   } 
} 
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");
			//設(shè)置根路徑。(這里設(shè)置的根路徑顯然沒(méi)被writeFile使用) 
			CtClass cc = pool.makeClass("com.thrblock.javassist.EditableChanged");
			//模擬Hibernate代理模式,我們創(chuàng)建一個(gè)新類(lèi) 
			cc.setSuperclass(pool.get("com.thrblock.javassist.Editable"));
			//設(shè)置其父類(lèi) 
			CtMethodcm = CtNewMethod.make("public void showInfo(){super.showInfo();System.out.println(\"CustomInsertHAHA!\");}",cc);
			//追加一個(gè)方法,注意它覆蓋了父類(lèi)中的方法。 
			cc.addMethod(cm);
			cc.writeFile(".\\bin");
			//這里比較重要,空參的結(jié)果就是沒(méi)有保存到eclipse字節(jié)碼根路徑里。
		}
		catch (NotFoundException | CannotCompileException | IOException e) {
			e.printStackTrace();
		}
		try{
			Class<?> cl = Class.forName("com.thrblock.javassist.EditableChanged");
			//加載我們的新類(lèi) 
			Editableed = (Editable) cl.newInstance();
			//由于其繼承與Editable類(lèi),這里和Hibernate里的load道理一樣。 
			ed.showInfo();
			//調(diào)用方法。
		}
		catch (ClassNotFoundException | InstantiationException |IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

打印結(jié)果:

InfoDefault!

CustomInsertHAHA!

其他注意事項(xiàng):

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

總結(jié)

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

相關(guān)文章

  • 解決SpringBoot配置文件項(xiàng)目重啟出現(xiàn)亂碼的問(wèn)題

    解決SpringBoot配置文件項(xiàng)目重啟出現(xiàn)亂碼的問(wèn)題

    最近在創(chuàng)建了SpringBoot項(xiàng)目后往配置文件中寫(xiě)了相關(guān)的系統(tǒng)配置,并且在上面加了中文注釋?zhuān)窃谥貑㈨?xiàng)目或開(kāi)機(jī)重啟后遇到了注釋亂碼的情況,下面這篇文章主要給大家介紹一下如何解決SpringBoot配置文件項(xiàng)目重啟出現(xiàn)亂碼的問(wèn)題,需要的朋友可以參考下
    2023-06-06
  • java 反射和動(dòng)態(tài)代理詳解及實(shí)例代碼

    java 反射和動(dòng)態(tài)代理詳解及實(shí)例代碼

    這篇文章主要介紹了java 反射和動(dòng)態(tài)代理詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Java Collection集合用法詳解

    Java Collection集合用法詳解

    首先Collection是屬于單列集合的頂層接口,表示為一組對(duì)象。其類(lèi)型為引用數(shù)據(jù)類(lèi)型,具體創(chuàng)建對(duì)象,通過(guò)多態(tài)的形式進(jìn)行,本文將給大家詳細(xì)的介紹,需要的朋友可以參考下
    2021-10-10
  • mybatis通過(guò)TypeHandler?list轉(zhuǎn)換string類(lèi)型轉(zhuǎn)換方式

    mybatis通過(guò)TypeHandler?list轉(zhuǎn)換string類(lèi)型轉(zhuǎn)換方式

    這篇文章主要介紹了mybatis通過(guò)TypeHandler?list轉(zhuǎn)換string類(lèi)型轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 使用IDEA配置Maven搭建開(kāi)發(fā)框架ssm教程

    使用IDEA配置Maven搭建開(kāi)發(fā)框架ssm教程

    這篇文章主要為大家詳細(xì)介紹了使用IDEA配置Maven搭建開(kāi)發(fā)框架ssm教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Jackson將json string轉(zhuǎn)為Object,org.json讀取json數(shù)組的實(shí)例

    Jackson將json string轉(zhuǎn)為Object,org.json讀取json數(shù)組的實(shí)例

    下面小編就為大家?guī)?lái)一篇Jackson將json string轉(zhuǎn)為Object,org.json讀取json數(shù)組的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-12-12
  • Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼

    Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼

    這篇文章主要介紹了Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    這篇文章主要介紹了使用Spring從YAML文件讀取內(nèi)容映射為Map方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 基于Spring概念模型:PathMatcher 路徑匹配器

    基于Spring概念模型:PathMatcher 路徑匹配器

    這篇文章主要介紹了Spring概念模型:PathMatcher 路徑匹配器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JavaWeb三大組件之一的Filter詳解

    JavaWeb三大組件之一的Filter詳解

    本篇文章主要介紹了JavaWeb三大組件之中的Filter過(guò)濾器詳解,實(shí)例分析了JavaWeb之Filter過(guò)濾器的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論