当前位置:首页 > 编程教程 > java技术文章 > Eclipse下Javassist正确使用方法代码解析

Eclipse下Javassist正确使用方法

  • 发布时间:
  • 作者:码农之家
  • 点击:162

这篇文章主要知识点是关于eclipse、javassist、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

JavaScript忍者秘籍
  • 类型:JavaScript大小:83.5 MB格式:PDF作者:莱西格
立即下载

Eclipse下Javassist正确使用方法代码解析

这两天看到Hibernate的代理部分,第一反应是底层使用了反射,针对用户实体生成了代理类,后来反应过来了,反射没有任何可以产生新类的能力,也就顺理成章地找到了Javassist(下载地址)。

在网上搜索到的大部分教程,都是针对Javassist的API进行一番讲解,但是最后,往往没有一个加载过程,而笔者模仿这些教程进行类的加载时,加载到的结果都是原来的类,并没有产生字节码被修改的内容。

在经过一番探索后,笔者发现,网上的大部分教程中的最后一步,保存字节码,使用的均是writeFile的无参数重载,在查看其函数结构后发现,它还有一个String类型的重载,由于在Eclipse下,字节码储存的根位置并不是”.\\”而是”.\\bin”,而writeFile的另一个重载很可能是指定字节码根位置的参数,笔者进行一番更改后发现,果不其然。

下面将演示代码分享出来:

这是笔者项目的结构:

Eclipse下Javassist正确使用方法代码解析

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");
			//设置根路径。(这里设置的根路径显然没被writeFile使用) 
			CtClass cc = pool.makeClass("com.thrblock.javassist.EditableChanged");
			//模拟Hibernate代理模式,我们创建一个新类 
			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字节码根路径里。
		}
		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();
			//调用方法。
		}
		catch (ClassNotFoundException | InstantiationException |IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

打印结果:

InfoDefault!

CustomInsertHAHA!

其他注意事项:

由于我们是生成了一个类,如果这个类名和原类名一样,则会覆盖class文件,但是如果修改之前该class已经被JVM装入,则修改的部分不会生效,必须重启JVM。

总结

以上就是本文关于Eclipse下Javassist正确使用方法代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

  • Eclipse添加get、set方法总结以及操作技巧整理
  • 前言 在开发过程中需要快速新建getXXX();setXXX()方法的时候,就会想能否批量实现呢?例如实现如下代码,一次性操作,不是一个一个码出来! public class User extends BaseModel { private static final long serialVersionUID = 1L; private String id; private String name;// 用户名 private String user_type; private String status;// 状态 private String user_pwd;// 用户密码 private String user_rights;// 用户权限 private String real_name;// 姓名……

  • 在Eclipse导入XSD文件,使用XML自动提示
  • 对于SpringMVC的下载包,XSD文件存放在压缩包里的Schema文件夹里,而且各功能的XSD存放在各自文件夹内,把最新版本的XSD文件取出。 Eclipse软件,依次选择Window--Preferences,弹出Preferences窗体,左侧,展开XML -- XML Catalog,对User Specified Entries,选择Add... 找到XSD文件存放位置,并填上 要注意的是:KeyType选择Schema location,并且Key值的后面要加上/xxxxx-x.x.xsd文件名,跟上面的Location后的文件……

  • eclipse创建java项目的方法详解
  • 本文为大家分享了如何使用eclipse创建java项目,供大家参考,具体内容如下 首先,打开Eclipse,在工具栏依次点击【File】【New】【Other】,这个窗口显示的所有我们可以新建的项目类型,上面有个搜索框可以输入你想新建什么样的项目 我们在搜索框里输入【java】,然后下面会列出符合要求的列表,我们点击一下【Java Project】,然后点击【Next】 这里要输入你JAVA项目的名称了,我测……

  • 分析怎样让Eclipse中pydev为此跳过这些编译error
  • #1.如下程序是一个tensorflow的神经网络代码的开始一小部分,用来说明如何简单的做TF版本兼容及如何在pydev中忽略编译错误来运行 #2.因为TF版本尚不稳定,不同版本间差别不小,github上有不少0.10.0,0.11.0,1.0.1等不同TF版本的python程序,所以你本地环境是一套py和tf就容易发现此起彼伏的问题。 #3.如下是一个简单的解决办法,用try...except结构来做tf的版本兼容,这样可以不用到代码中每……

    java 相关电子书
    学习笔记

    Copyright 2018-2020 xz577.com 码农之家

    本站所有电子书资源不再提供下载地址,只分享来路

    版权投诉 / 书籍推广 / 赞助:QQ:520161757