Javasssist初探(需要对Java的ClassLoader机制有一些了解)

SSS框架详解 立即下载

Javassist可以用来动态生成java类,就好像js可以生成可执行的js代码一样。javassist是JBoss的一个子项目,用处的话可能是在对EJB提供支持的时候,将声称各种接口的实现类和代理类。

下面给出一个例子,在这个例子中一共有三个类:DirectLoader自定义类加载器;IAccess是接口类(我们动态生成的类要实现这个接口) ;MainTest完成主要逻辑的类,其中javassist的使用也在这里面体现。下面给出三个类的源代码。需要使用javassist的jar包程序才能运行

 



//--------------DirectLoader------------------------------------
import java.security.SecureClassLoader;

public class DirectLoader extends SecureClassLoader{
    
protected DirectLoader() {
        
        
super(MainTest.class.getClassLoader());
    }


    
protected Class load(String name, byte[] data) {
        
return super.defineClass(name, data, 0, data.length);
    }

}



//--------------IAccess------------------------------------
import java.util.List;

public interface IAccess{
    
public void Calculate(List InVars) throws Exception;
}



//--------------MainTest------------------------------------

import java.util.List;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtMethod;

/*
 * 本类用来演示如何使用javassist动态生成
 
*/


public class MainTest {
    
private static final CtClass[] NO_ARGS = {};

    
//private static final CtClass[] INT_ARGS = { CtClass.intType };

    
private static boolean isFirst = true;

    
// 用这个标示标记是否需要重新生成新的类。
    
// 一般情况下,我们没必要动态生成类,如果有这个必要
    
// 就说明类需要动态改动并使用,所以,这个变量是很有用的
    private static boolean needReload = true;

    
private static DirectLoader s_classLoader = new DirectLoader();

    
public MainTest() {
    }


    
public static void main(String[] args) throws Exception {
        execTest();
        execTest();
    }


    
/**
     * 执行代码
     * 
     * 
@throws Exception
     
*/

    
public static void execTest() throws Exception {
        Class clas 
= null;
        
try {
            
if (needReload) {
                clas 
= createExecClass();
            }
 else {
                clas 
= s_classLoader.loadClass("ExecVar");
            }

        }
 catch (ClassNotFoundException e) {
            System.out.println(
"没有这个类,动态生成");
            clas 
= createExecClass();
        }

        
// 使用动态生成的类,最好是使用接口。否则就只能通过反射调用其方法了
        IAccess access = null;
        
try {
            access 
= (IAccess) clas.newInstance();
        }
 catch (IllegalAccessException ex) {
            ex.printStackTrace(System.err);
            System.exit(
1);
        }
 catch (InstantiationException ex) {
            ex.printStackTrace(System.err);
            System.exit(
1);
        }

        List
<String> list = new java.util.ArrayList<String>();
        list.add(
"This is a String ");
        
// 通过借口的引用调用我们动态生成的类的
        access.Calculate(list);
    }


    
private static Class createExecClass() throws Exception {
        
// ClassPool是javasssit中的类,作用嘛,自描述的
        ClassPool pool = ClassPool.getDefault();
        CtClass clas 
= null;
        
if (!isFirst) {
            
// 如果不是第一次,就必须要将原来的类在pool中作废,
            
// 否则无法在同一个pool中生成新的类
            
// 具体做法是否正确,有待进一步考证
            pool = ClassPool.getDefault();
            clas 
= pool.get("ExecVar");
            
if (clas.isFrozen()) {
                System.out
                        .println(
"Class ExecVar is frozen,Please looking for something that can make it unfrozen!");
                
// clas.defrost();
                
//从pool中拆离这个类
                clas.detach();
            }

        }

        isFirst 
= false;

        
// 动态生成一个类
        clas = pool.makeClass("ExecVar");
        clas.addInterface(pool.get(
"IAccess"));
        
// 增加默认的构造方法
        CtConstructor cons = new CtConstructor(NO_ARGS, clas);
        cons.setBody(
";");
        clas.addConstructor(cons);

        
// 增加一个方法,参数为java.util.List,返回值是空,名字叫做Calculate,所属类是clas
        CtMethod meth = new CtMethod(CtClass.voidType, "Calculate",
                
new CtClass[] { pool.get("java.util.List") }, clas);
        
// 用这个随机数检测是否是新生成的类
        double random = Math.random();
        meth.setBody(
"System.out.println("这是一个reload测试:"+$1.get(0)+",随机数:"
                
+ random + "");");
        
// 将方法加入其中
        clas.addMethod(meth);
        
// 创建一个新的ClassLoader,以加载新的生成的类,旧的s_classLoader连同旧的
        
// ExecVar类一起被废弃
        s_classLoader = new DirectLoader();
        
return s_classLoader.load("ExecVar", clas.toBytecode());
    }

}




java 反编译工具 jboss-javassist 能够实现java包的重写,分析,java程序的利器,不会的可以网上搜索相关使用方法,也可以留言求助。内含java包及demo,使用时直接引用java包即可。 立即下载

相关推荐

行政数据分析大屏实战:用Tableau从Excel到看板的完整搭建流程(含数据连接与字段计算避坑)

本文详细介绍了如何利用Tableau从Excel数据源搭建行政数据分析大屏的完整流程,涵盖数据准备、连接技巧、计算字段优化、看板设计及动态交互部署。通过五阶工作流,帮助用户高效处理多源异构数据,实现业务洞察与可视化呈现,提升行政数据分析效率。

weixin_29696711的博客 341

java工程重写jar包中class类覆盖问题

拓展:tomcat容器中类加载顺序:https://blog.youkuaiyun.com/HQqHQhqqhq/article/details/127126453。重复的类只加载一次,加载我们复写后的类后就不会在加载lib 目录下的jar包。结论:直接在程序中复写jar中的类即可。

岑如花 1203

Win11安装Office2021

windows11安装office2021。

1万+

java类名相同时覆盖原则_java26

1.方法的覆盖原则-1-子类和父类的名字必须相同,不然不叫覆盖-2-判断是否实现覆盖:[emailprotected],如果覆盖内容不报错,说明已经实现方法的覆盖,这时父类和子类的名字必须相同。-3-父类和子类返回值类型必须相同-4-父类和子类的签名(方法名+参数)必须相同-5-子类必须比父类的访问权限相同或者比父类的访问权限大。2.在调用方法时会先去访问子类(本类),然后去访问父类。3.只有方...

weixin_42318708的博客 1760

从Microchip SDK到STM32实战:手把手教你移植LAN9252 EtherCAT从站驱动(含EEPROM配置避坑)

本文详细介绍了如何将Microchip SDK中的LAN9252 EtherCAT从站驱动移植到STM32F407平台,包括FSMC接口配置、中断处理适配和EEPROM配置等关键步骤。通过实战指南和避坑技巧,帮助开发者快速实现高性能EtherCAT从站设备的开发,适用于工业自动化领域。

weixin_29197835的博客 446

NA400与昆仑通态MODBUS/TCP通讯调试说明

点击增加设备通道,弹出窗口进行设置,通道类型选择“0区输出继电器”,通道地址为1,通道个数为1,读写方式为读写。点击增加设备通道,弹出窗口进行设置,通道类型选择“4区输出寄存器”,数据类型选择“16位 无符号二进制”,通道地址为21001,通道个数为1,读写方式为读写。5.添加设备通道:双击莫迪康MODBUSTCP子设备,点击添加设备通道,根据Modbus规约地址表进行参数的设置,表格可在NAPro软件帮助中查看,如下图所示。然后可以在设备通道调试数据中观察到Q1的值为1,NW1的值678,表示通讯成功。

weixin_44281509的博客 2490

Java 动态字节码生成技术 javassist

转载自:http://www.tianshouzhi.com/api/tutorials/bytecode/354 叙述 关于java字节码的处理,目前有很多工具,如javassist,bcel,asm,cglib,以及jdk6引入的JavaCompiler等。 其中,CGLib的底层基于ASM实现,是一个高效高性能的生成库;而ASM是一个轻量级的类库,但需要涉及到JVM的操作和指令。这些实现都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令。 javassist是jboss的一个子项目,其主要

lizhengyu891231的博客 687

VS2010“未能正确加载包”问题解决方法小汇

本文按照由简至繁的顺序详述了借助网络获知的四种解法,主要面向重装 VS2010 后遭遇题述问题的网友,相关包尤指 VSTS、RadLangSvc、Language、Bootstrap 及 MicrosoftDataEntityDesign。

虚有其表的博客 1万+

Java字节码Javassist之ClassLoader(三)

Java字节码之Javassist

数据库耕耘者 674

5分钟搞定!用ZLMediaKit搭建GB28181视频监控系统(含避坑指南)

本文提供了一份基于ZLMediaKit搭建GB28181视频监控系统的实战指南。文章详细介绍了从环境准备、核心组件(ZLMediaKit与SIP服务器)部署、摄像头配置到内外网穿透的完整流程,并重点分享了设备ID配置、防火墙设置等关键避坑经验,帮助开发者快速构建稳定可控的监控平台。

apple5的专栏 1086

C#跨平台制图新纪元:Mapsui,一库在手,地图我有

深入学习Mapsui的渲染机制,定制属于你的地图样式,无论是颜色、图标还是文字,都可以随心所欲。

java专栏 1457

javassist编程指南==Class loader 类加载

Class loader 类加载 如果必须修改的类是预先知道的,最简单的修改类的方式可能是以下这些: 1.通过调用ClassPool.get()获取一个CtClass对象。 2.修改它,并且 3.调用CtClass对象的writeFile()或者toBytecode()方法获得修改后的class文件 如果类是否被修改是在加载时确定的,用户必须让javassist与类加载器协作。 javassi...

青山师 2956

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Javassist-官方文档中文翻译-第三章-ClassLoader详解

这是把官方的文档给翻译了,顺便学习,一共10章,可以到下面地址查看,里面可能有翻译不准的地方,欢迎指正 https://github.com/IndustriousSnail/javassist-learn 如果一开始你就知道要修改哪个类,那么最简单的方式如下: 1.调用ClassPool.get() 来获取一个CtClass对象。 2.修改它 3.调用writeFile() 或 toByte...

iioSnail的博客 806

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Javassist详解

1. 简介 在博客中我们有提到关于Java反射,Java反射可以实现运行时加载,探知,自省,使用编译期完全未知的classes,获悉其完整构造,并生成其实体对象,或对fields设值。 自审:通过Java的反射机制能够探知到java类的基本机构,这种对java类结构探知的能力,我们称为Java类的“自审”。 Java的反射原理最典型的应用就是各种java IDE:比如Jcreateor,ec

xianymo的专栏 7308

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 编程的动态性,第 6 部分: 利用 Javassist 进行面向方面的更改

Java 顾问 Dennis Sosnoski 在他的关于 Javassist框架的三期文章中将精华部分留在了最后。这次他展现了 Javassist 对搜索-替换的支持是如何使对 Java字节码的编辑变得像文本编辑器的“替换所有(Replace All)”命令一样容易的。想报告所有写入特定字段的内容或者对方法调用中参数的更改中的补丁吗?Javassist 使这变得很容易,Dennis

MapleElf的专栏 727

javassist与classLoader

  javassist.jar是个非常不错的classCode修改框架,简单实用   通过javassist和classLoader结合,在加载class时修改class,类似于Spring AOP,可以在指定的class中额外加载指定的功能   下面的例子中,在AppClassLoader的classPath中包含的class都加入了方法信息打印(参数打印、方法调用栈),方法返回信息打...

benx 736

java ssssss,Javasssist的简单使用

动机前两天在项目中遇到了一个关于webflow的问题。在访问页面时,老是提示无法找到流转节点。后来跟源码发现webflow在记录流转节点的时候做了个数限制,最多只能存5个流转节点。于是怀疑时跳转判断流程太多,导致原来存储的流转节点被后来新生成的流转节点覆盖了(后来发现不是)。于是想修改webflow记录的流程节点个数限制。那么问题来了,这个东西并没有在Spring里面配置,而是直接写在代码里面了,...

weixin_28851191的博客 447

java基础入门书籍推荐,实战篇

第1部分:基础篇 第2部分:开发篇 第3部分:优化篇 第4部分:管理维护篇 Spring全套教学资料 Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。 资料领取方式:点击这里前往蓝色传送门 目录: 部分内容: Spring源码 第一部分 Spring 概述 第二部分 核心思想 第三部分 手写实现 IoC 和 AOP(自定义

m0_57286518的博客 431

springboot 整合javassist详解

Javassist 是一个开源,用于分析、编辑和创建Java字节码的类库,由东京工业大学数学和计算机科学系的 Shigeru Chiba (千叶滋)所创建。目前已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。通过使用Javassist可以使Java程序在运行时定义一个新的类,并且在JVM加载类文件时修改它Javassist提供两个级别的API:源码级别和字节码级别。

Code Writers 2599

javassist使用指南

目录一、快速入门1.1 创建class文件1.2 ClassPool的相关方法1.3 CtClass的相关方法1.4 CtMethod的相关方法1.5 调用生成的类对象1.5.1 通过反射调用1.5.2 通过接口调用1.6 修改现有的类对象二、将类冻结三、类搜索路径四、$开头的特殊字符五、ProxyFactory的使用 我们知道Java字节码以二进制的形式存储在class文件中,每一个class文件包含一个Java类或接口。Javaassist 就是一个用来处理Java字节码的类库。在Javassist 中

热爱不止,前行不息 9928

javassist入门

javassist的基本功能Javassist是一个动态类库,可以用来检查、”动态”修改以及创建 Java类。其功能与jdk自带的反射功能类似,但比反射功能更强大。重要的类ClassPool:javassist的类池,使用ClassPool 类可以跟踪和控制所操作的类,它的工作方式与 JVM 类装载器非常相似, CtClass: CtClass提供了检查类数据(如字段和方法)以及在类中添加新字段、

bjo2008cn的专栏 1万+

Java字节码操作以及JAVAsssist类库

Java字节码操作以及JAVAsssist类库 一、字节码操作概述 JAVA动态性的两种常见实现方式 字节码操作 反射 运行时操作字节码可以让我们实现如下功能 动态生成新的类 动态改变某个类的结构(添加/删除/修改/添加新的属性/方法) 优势 比反射开销小、性能高 常见的字节码操作类库 BCEL ASM CGLIB JAVAssist 二、JAVAssist 概述 ...

职业炮灰的博客 712

Javassist 字节码操作

Javassist  1.读写字节码 Javassist是用来处理java字节码的类库。字节码保存在二进制文件中称为类文件。每个类文件夹包括一个java类或接口。 Javasssist.CtClass这个类是一个类文件的抽象表示。一个CtClass(compile-time class编译时类)对象处理一个类文件。下面是个简单的例子: ClassPool pool = Cl

Java Dynamic的专栏 4929

Java 编程的动态性, 第四部分: 用 Javassist 进行类转换

用 Javassist 转换字节码中的方法 文档选项 打印本页 将此页作为电子邮件发送 级别: 初级 Dennis M. Sosnoski (dms@sosnoski.com), 总裁, Sosnoski Software Solutions, Inc. 2003 年 10 月 25 日 厌倦了只能按编写好源代...

小头猪 237
上一篇: Timer和TimerTask的使用
下一篇: 使用SAX解析msn聊天记录文档的java小程序
DeepNightTwo
博客等级 码龄21年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值