javassist 02 implement interface

news2024/9/25 1:24:26

创建 interface 

package com.wsd;

public interface AccountDao {

    int delete();
}

利用 javassist 生产一个 类A, Class A implements AccountDao 

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

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

        //创建一个interface,需要告知全类名
        CtClass ctInterface = classPool.makeInterface("com.wsd.AccountDao");

        //实现 interface
        ctClass.addInterface(ctInterface);

        //实现 接口中的方法
        //创造 method
        CtMethod ctMethod = CtMethod.make("public int delete(){System.out.println(\"run delete method\");return 0;}", ctClass);

        //将方法添加到类上
        ctClass.addMethod(ctMethod);

        //加载 生成的 类的字节码到 JVM
        Class<?> aClass =  ctClass.toClass();

        //create instance
       AccountDao accountDao = (AccountDao) aClass.newInstance();

       accountDao.delete();
    }

    
}

在实现接口中的方法时,并不能预先知晓接口中有哪些类,那么如何实现接口中的方法?

package com.wsd;

import javassist.*;
import org.junit.Test;

import java.lang.reflect.Method;
import java.util.Arrays;

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

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

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

        //创建一个interface,需要告知全类名
        CtClass ctInterface = classPool.makeInterface("com.wsd.AccountDao");

        //实现 interface
        ctClass.addInterface(ctInterface);

        //实现 接口中的方法
        //获取接口中的方法
        Method[] declaredMethods = AccountDao.class.getDeclaredMethods();


        //遍历实现所有的 method
        Arrays.stream(declaredMethods).forEach(
                method -> {
                    StringBuilder methodCode = new StringBuilder();
                    //method code
                    methodCode.append("public " + method.getReturnType().getSimpleName() +" " + method.getName() + "(");
                    //获取方法的参数列表
                    Class<?>[] parameterTypes = method.getParameterTypes();
                    //拼接形参列表
                    for(int i = 0; i < parameterTypes.length; i++){
                        String parameterName = parameterTypes[i].getSimpleName();
                        methodCode.append( parameterName + " arg" + i);
                        if(i == parameterTypes.length - 2){
                            methodCode.append(", ");
                        }
                    }
                    methodCode.append(")");
                    //方法体
                    methodCode.append("{System.out.println(\"run " + method.getName() + " method\");return ");
                    //根据返回类型而拼接不同的返回值
                    if( "int".equals( method.getReturnType().getSimpleName() ) ){
                        methodCode.append("1;}");
                    }else if("String".equals( method.getReturnType().getSimpleName() )){
                        methodCode.append("\"success\";}");
                    }

                    System.out.println(methodCode.toString());
                    CtMethod ctMethod = null;
                    try {
                        //创造 method
                        ctMethod = CtMethod.make(methodCode.toString(), ctClass);
                        //将方法添加到类上
                        ctClass.addMethod(ctMethod);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
        );

        //加载 生成的 类的字节码到 JVM
        Class<?> aClass =  ctClass.toClass();

        //create instance
       AccountDao accountDao = (AccountDao) aClass.newInstance();

       accountDao.delete(1);
       accountDao.select(2);
    }
}

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

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

相关文章

mac桌面时钟 浮动 (python)

浮动时钟&#xff0c;多地时区 app store的都要钱&#xff0c;于是。。。。我们让chatgpt来实现一个吧&#xff1a; 数字&#xff1a; 代码&#xff1a; import sys import datetime import pytzfrom PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGr…

深度学习不同数据增广方法的选用分析

一般情况下&#xff0c;可以将数据扩增方法分为单数据变形、多数据混合、学习数据分布规律生成新数据和学习增广策略等4 类方法。以上顺序也在一定程度上反映了数据增广方法的发展历程。如果与Shorten和Khoshgoftaar的成果对照&#xff0c;就图像数据而言&#xff0c;基于数据变…

抖音矩阵源码搭建开发技术部署分析

目录 一、 什么是抖音矩阵&#xff1f;源码搭建开发注意事项&#xff1f; 1. 抖音矩阵概述 2. 源码搭建开发注意事项&#xff1a; 二、 使用步骤及开发代码展示 一、 什么是抖音矩阵&#xff1f;源码搭建开发注意事项&#xff1f; 1. 抖音矩阵概述 首先&#xff0c;抖音账…

21夜间车牌识别(matlab程序)

1.简述 简单说一下实现思路&#xff1a; 读取图片&#xff0c;转灰度&#xff0c;计算灰度直方图&#xff0c;估算阈值&#xff08;这里的阈值计算很重要&#xff0c;经过阈值算法&#xff0c;选取一个最恰当的阈值&#xff09;&#xff0c;之后二值化。显示图像即可。 实现目…

爬虫爬取公众号文章

前言 自从chatGPT出现后&#xff0c;对于文本处理的能力直接上升了一个维度。在这之前&#xff0c;我们爬取到网络上的文本内容之后&#xff0c;都需要写一个文本清理的程序&#xff0c;对文本进行清洗&#xff0c;而现在&#xff0c;有了chatGPT的加持&#xff0c;我们只需要…

解决程序占用较多内存的问题

今天发现自己开发的一个程序占用了大量内存而且不会自动释放 &#xff0c;我的程序在windows中运行的&#xff0c;解决办法如下&#xff1a; 第一步&#xff1a;打开任务管理器&#xff0c;打到正在运行程序 &#xff08;这里以sql server为例&#xff09;&#xff0c;然后右击…

设计合并排序算法实现对N个整数排序。

1.题目 设计合并排序算法实现对N个整数排序 2.设计思路 先将无序序列利用分治法划分为子序列,直至每个子序列只有一个元素,然后再对有序子序列逐步进行合并排序。合并方法是循环的将两个有序子序列当前的首元素进行比较,较小的元素取出,置入合并序列的左边空置位,直至其中…

特征选择算法 | Matlab 基于最大相关最小冗余特征选择算法(mRMR)的分类数据特征选择

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab 基于最大相关最小冗余特征选择算法(mRMR)的分类数据特征选择 部分源码 %--------------------

Redis实战案例12-添加秒杀券实现秒杀下单及相关问题解决

1. 添加优惠券 该项目没有后台管理的界面&#xff0c;所以采用postman发送请求 http://localhost:8081/voucher/seckill注意end时间要大于当前系统时间 {"shopId": 2,"title": "100元代金券","subTitle": "周一至周五均可使用&qu…

c++查漏补缺

c语言的struct只能包含变量&#xff0c;而c中的class除了包含变量&#xff0c;还可以包含函数。 通过结构体定义出来的变量还是变量&#xff0c;而通过类定义出来有了新的名称&#xff0c;叫做对象。C语言中&#xff0c;会将重复使用或具有某项功能的代码封装成一个函数&#x…

【剑指offer】8. 斐波那契数列(java)

文章目录 斐波那契数列描述输入描述&#xff1a;返回值描述&#xff1a;示例1示例2示例3思路非递归递归 完整代码 斐波那契数列 描述 大家都知道斐波那契数列&#xff0c;现在要求输入一个正整数 n &#xff0c;请你输出斐波那契数列的第 n 项。 斐波那契数列是一个满足 f …

PHP学生工作平台管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP学生工作平台管理系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为PHP APACHE&#xff0c;数据 库为mysql5.0&#xff0c;使用php语言开发…

linux 如何挂载fat32格式u盘,如何挂载NTFS 文件系统的硬盘

linux系统默认可以识别fat32u盘&#xff0c;对ntfs格式u盘不能识别 具体挂载方式如下 1、插入u盘 2、mkdir /mnt/usb 此命令用于创建挂载u盘的目录&#xff0c;只需创建一次就可以&#xff0c;若已经存在则不需要再次创建 3、fdisk -l 找到u盘路径 上图显示的sdb1,sdb2,sdb5…

Gradio,我们可以为我们的模型创建Web界面

Gradio是一个Python库&#xff0c;允许我们快速为机器学习模型创建可定制的接口。 使用Gradio&#xff0c;我们可以为我们的模型创建Web界面&#xff0c;而无需编写任何HTML&#xff0c;CSS或JavaScript。 Gradio旨在与广泛的机器学习框架配合使用&#xff0c;包括TensorFlow&a…

IOU发展历程学习记录

概述 IOU的出现主要最先运用在预测bbox框和target bbox框之间的重叠问题&#xff0c;为NMS提供相应的数值支撑。另外在bbox框的回归问题上&#xff0c;由于L1 Loss存在如下问题&#xff1a;当损失函数对x的导数为常数&#xff0c;在训练后期&#xff0c;x很小时&#xff0c;若…

GEE:基于MODIS土地覆盖类型“混交林”的净初级生产力(NPP)的区域统计

作者:CSDN @ _养乐多_ 本文将介绍如何使用Google Earth Engine(GEE)平台提取特定地区的净初级生产力(NPP)的统计信息,并在地图上可视化。通过加载MODIS数据集,并使用GEE提供的函数和方法,能够高效地计算特定地区的净初级生产力的平均值。 文章目录 一、代码详解二、代…

大模型的数据供血系统-向量数据库常识科普

1. 数据库行业有了新动向 对于传统数据库研发运维来说&#xff0c;数据库行业上次有概念创新&#xff0c;还是十几年前的NoSQL…… 在AI大行业发展的推进下&#xff0c;向量数据库成为了最新兴的数据库技术趋势&#xff0c;业内多家开源向量数据库都拿到了高额融资&#xff0c;…

《网络是怎样连接的》-户根勤

第一章&#xff1a;浏览器生成消息-探索浏览器内部 主要讲HTTP消息、DNS和委托协议栈发送消息。 第二章&#xff1a;用电信号传输TCP/IP数据-探索协议栈和网卡 主要讲套接字的创建、连接、通信、断开和删除四个阶段&#xff1b;IP与以太网的包收发阶段&#xff1b;UDP协议的收…

使用LocalThread获取当前线程的用户ID错误

说明&#xff1a;LocalThread是线程变量&#xff0c;可以往该线程变量中填充我们项目用户的ID&#xff0c;可以在其他的业务代码中直接获取&#xff0c;十分方便&#xff0c;详细参考&#xff1a;http://t.csdn.cn/k75rs LocalThread使用 第一步&#xff1a;创建类 创建一个…

北京市自动驾驶出行服务商业化试点启动,无人驾驶会是未来吗?

北京市高级级别自动驾驶示范区工作办公室公告称&#xff0c;智能网联乘用车“车内无人”商业化试点正式启动。根据最新修订的《北京市智能网联汽车政策先行区自动驾驶出行服务商业化试点管理细则&#xff08;试行&#xff09;》&#xff0c;企业在满足相关要求后&#xff0c;可…