javassit 01

news2024/11/25 5:51:02

Javassist:

Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。

pom.xml: 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wsd</groupId>
    <artifactId>testjavassist</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--javassist 依赖-->
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.29.1-GA</version>
        </dependency>

        <!--junit 依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>

</project>

利用javassist 生成一个类A,创建A类的 instance a and 调用 method of a

package com.wsd;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import org.junit.Test;

import java.lang.reflect.Method;

/**
 * @program: webmybatis
 * @description: test Javassist
 * @author: Mr.Wang
 * @create: 2023-07-04 22:02
 **/
public class TestJavassist {

    @Test
    public void testGenerateClass() throws Exception{

        //获取一个默认的 ClassPool 实例
        //Javassist 是一个 Java 字节码编辑库,它可以在运行时修改已加载的类或者生成新的类。
        // ClassPool 是 Javassist 的核心组件,它是一个类容器,负责存储和管理字节码(.class 文件)
        ClassPool classPool = ClassPool.getDefault();

        //创建一个类对象,需要告知全类名
        CtClass ctClass = classPool.makeClass("com.wsd.TestGenerateCode");

        // 创建方法
        // 1.返回值类型 2.方法名 3.形式参数列表 4.所属类
        CtMethod ctMethod = new CtMethod(CtClass.voidType, "execute", new CtClass[]{}, ctClass);
        // 设置方法的修饰符列表
        ctMethod.setModifiers(Modifier.PUBLIC);
        // 设置方法体
        ctMethod.setBody("{System.out.println(\"hello world\");}");
        // 给类添加方法
        ctClass.addMethod(ctMethod);
        // 生成的类加载到JVM,返回 Class
        Class<?> aClass = ctClass.toClass();
        //反射创建 instance
        Object o = aClass.newInstance();
        //获取对象的 execute method
        Method method = aClass.getDeclaredMethod("execute");
        //调用 method
        method.invoke(o);

    }
}

 添加参数

 

  • --add-opens java.base/java.lang=ALL-UNNAMED
  • --add-opens java.base/sun.net.util=ALL-UNNAMED

 

 

 

 run to success

 

VM options 是用于配置 Java 虚拟机的启动参数。这些参数可以影响 JVM 的性能、资源使用和行为

Environment variables 是用于设置操作系统环境变量的。环境变量可以在程序运行时影响程序行为

环境变量是键值对形式的数据

问题的原因:

在 Java 9 及以后的版本中,模块系统(Jigsaw)的引入为 Java 平台带来了更严格的封装。默认情况下,Java 核心库的某些包和类是不允许通过反射访问的。

  1. VM options 设置为 --add-opens java.base/java.lang=ALL-UNNAMED。这个参数将 java.base 模块中的 java.lang 包打开,使得所有未命名模块(即,未通过模块系统明确指定的模块)可以访问这个包中的类。这样,Javassist 就可以操作 java.lang 包中的类了。

  2. Environment variables 设置为 --add-opens java.base/sun.net.util=ALL-UNNAMED。类似地,这个参数将 java.base 模块中的 sun.net.util 包打开,使得所有未命名模块可以访问这个包中的类。这对于 Javassist 在操作 Java 17 字节码时可能需要访问 sun.net.util 包中的一些类是必要的。

这些设置确保了 Javassist 在 Java 17 环境下可以正常工作,通过打开必要的包来访问和修改 Java 字节码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java SSM 重制版(三)SpringSecurity

SpringSecurity 基于Spring6的重制版&#xff0c;截止目前&#xff0c;最新的版本是6.1.1版本。 前置课程&#xff1a;《Spring核心内容》《SpringMvc》《JavaWeb》《Java9-17新特性》 安全是开发者永远绕不开的话题&#xff0c;一个不安全的网站&#xff0c;往往存在着各种…

主机与虚拟机ubuntu网络无法ping通问题

一. 主机与虚拟机无法ping通问题 在嵌入式开发中&#xff0c;经过会涉及网络方面的问题。最常用到的是开发板在 虚拟机&#xff08;ubuntu&#xff09;通过NFS服务挂载到ubuntu中&#xff0c;这里就涉及网络是否可以ping通问题。 开发板 ping 通 ubuntu虚拟机系统的前提&…

基于matlab使用视频和深度学习进行手势识别(附源码)

一、前言 此示例首先演示如何使用预训练的SlowFast视频分类器执行手势识别&#xff0c;然后演示如何使用迁移学习在自定义手势识别数据集上训练分类器。 基于视觉的人类手势识别涉及使用一组视频帧预测手势&#xff0c;例如挥手打招呼、手语手势或鼓掌。手势识别的一个吸引人…

启动失败之源发行版 17 需要目标发行版 17

一、java: 警告: 源发行版 17 需要目标发行版 17 1.1.原因 :JDK 版本不对。 这里可以看到&#xff0c;项目需要的是JDK17&#xff0c;而我这里用的是JDK1.8。 1.2.修改 这里有两种操作&#xff0c;一种是修改项目版本&#xff0c;一种是修改JDK版本。无论是哪一种&#xff0…

CentOS7使用ping命令测试主机或者外部网络不通(已解决)

CentOS7使用ping命令测试主机或外部网路显示“目标主机不可达”或者其他原因失败。 说明 当尝试了所有修改配置&#xff0c;关闭防火墙等操作之后&#xff0c;还是没有成功的条件下。 查看计算机中的VMware相关的服务是否打开。 此电脑–右击–管理–服务与应用程序–服务 …

【小吉带你学Git】Git命令(用户签名,本地库,暂存区,文件,版本 等命令)

&#x1f38a;专栏【Git】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f33a;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;设置用户签名⭐命令⭐如何在Windows上面查看自己的签名 &am…

eNSP-静态路由表的配置

eNSP-静态路由表的配置 文章目录 eNSP-静态路由表的配置一、拓扑结构二、关键语句三、完整代码四、测试验证 一、拓扑结构 二、关键语句 ip route-static x.x.x.x y z.z.z.z 语法&#xff1a;目标网段 掩码 下一跳 例如 PC1所在网段访问PC2所在网段 在AR1中输入 ip route-st…

scratch 鼠标控制角色移动

scratch 鼠标控制角色 本程序使用鼠标操作“机器人”角色跟随鼠标&#xff0c;距离较小时暂停移动&#xff1b;“小狗”角色连续在随机位置生成、水平移动、碰到边缘反弹、碰到“机器人”角色时删除。 目前scratch程序的制作已经告一段落了&#xff0c;进一步开发需要更多规划…

Redis【实战篇】---- 达人探店

Redis【实战篇】---- 达人探店 1. 达人探店 - 发布探店笔记2. 达人探店 - 查看探店笔记3. 达人探店 - 点赞功能4. 达人探店 - 点赞排行榜 1. 达人探店 - 发布探店笔记 发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_bl…

集成算法概述

集成算法的基本思想&#xff1a;训练时用多种分类器一起完成同一份任务。 测试时对待测试样本分别通过不同的分类器&#xff0c;汇总最后的结果。投票方式&#xff0c;可分为软投票和硬投票。 集成算法一般有三种&#xff0c;分别是Bagging模型、Boosting模型和Stacking模型。 …

微前端(拆分和细化,整合历史系统)

接入微前端 项目背景说明 假如我们完成了基于Vue2的项目&#xff0c;假设另外一个团队的小伙伴来实现前台可视化部分&#xff0c;他们使用的是最新的Vue3技术栈&#xff0c;现在有一个需求&#xff0c;他们的前台项目想直接使用我们的登录功能&#xff0c;获得token&#xff…

使用Thread和队列Queue实现线程池复用线程

线程池实现 线程池是一个线程管理技术&#xff0c;创建一个或者多个线程进行管理&#xff0c;避免线程的创建和销毁带来的开销线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这…

【BUG历险记】vivado报错:binding vhdl entity ‘ xxxxx ‘does not have port ‘ xxxxx ‘解决方案

&#x1f3d4;【BUG历险记】vivado报错&#xff1a;binding vhdl entity xxxxx does not have port xxxxx 解决方案 问题描述 我在编写雷达的脉冲压缩仿真时&#xff0c;先例化了FFT和复数乘法器&#xff0c;并仿真验证通过了&#xff1b;再例化IFFT&#xff0c;结果仿真时…

可信区块链运行监测服务平台(TBM)正式发布

6月29日&#xff0c;“Web3.0信任科技大会”于长沙开幕&#xff0c;大会由长沙市人民政府、中国信息通信研究院、中国通信标准化协会联合主办&#xff0c;长沙市委网络安全和信息化委员会办公室、长沙市工业和信息化局、长沙经济技术开发区管理委员会、可信区块链推进计划和中国…

leetcode周赛352

leetcode周赛352 1. 最长奇偶子数组 思路分析 这是一道变形的双指针题目我们可以使用相关算法模板基础上来书写左边界&#xff1a;偶数&#xff0c;且小于值threshold;所以我们需要寻找符合要求的左边界判断是否奇偶相间&#xff1a;只有 奇数偶数奇数 class Solution {static…

国产MCU-CW32F030开发学习--移植rtthread-nano

国产MCU-CW32F030开发学习–移植rtthread-nano 硬件平台 CW32_48F大学计划板CW32_IOT_EVA物联网开发评估套件 RT-Thread Nano RT-Thread Nano 是一个极简版的硬实时内核&#xff0c;它是由 C 语言开发&#xff0c;采用面向对象的编程思维&#xff0c;具有良好的代码风格&…

git clone 丢东西

1. git clone 丢东西 使用git clone https://gitee.com/123456789/123456789.git 克隆gitee 远程库上的代码发现少了一部分&#xff0c;只克隆了一部分下来&#xff0c;反复删除重新克隆都是一样的结果 2. 克隆下来后的文件&#xff0c;该目录下只有5 个文件&#xff0c;少了…

一文读懂北斗三号短报文!通信频度、电文长度、北斗民用智能卡申请、典型终端全面介绍

一、北斗短报文概述 北斗卫星导航系统&#xff08;Beidou Navigation Satellite System&#xff09;是中国自主研发和建设的全球卫星导航系统。该系统由一系列卫星、地面监控站和用户终端组成&#xff0c;旨在提供高精度、高可靠性的定位、导航和授时服务。北斗卫星导航系统的发…

QT编写的数字键盘

https://download.csdn.net/download/qq_20189555/88001237

Heroku 实践:如何成功将 Vue.js 的前端内容部署到 Heroku

文章目录 Vue.js 脚手架安装Vue CLI&#xff08;如果你还没有安装&#xff09;&#xff1a;创建新项目 Heroku 部署 Vue2项目目录server.jspackage.json创建 Procfile按照 heroku 的引导初始化 git 并提交代码 可能问题 Vue.js 脚手架 首先要使用 Vue 的脚手架来创建一个 vue …