文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java 动态添加字段 以及 动态新增字段注解

2023-08-22 08:21

关注

本文是从别的文章作为基础进行创建的,方便自己进行相关操作。

  1. 引入依赖
 <dependency>     <groupId>javassist</groupId>     <artifactId>javassist</artifactId>     <version>3.12.1.GA</version> </dependency>
  1. 我这里创建了一个空的对象
public class CitiesVo {}
  1. 创建一个自定义注解
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface Excel{    public String name() default "";}
  1. 适用main方法进行操作
public static void main(String[] args) throws Exception{        //默认的类搜索路径        ClassPool pool = ClassPool.getDefault();        //获取一个ctClass对象 com.example.demo.excel.entity.CitiesVo 这个是包的相对路径        CtClass ctClass = pool.get("com.example.demo.excel.entity.CitiesVo");        try {            //添加age属性            ctClass.addField(CtField.make("private int age;", ctClass));            //添加setAge方法            ctClass.addMethod(CtMethod.make("public void setAge(int age){this.age = age;}", ctClass));            //添加getAge方法            ctClass.addMethod(CtMethod.make("public int getAge(){return this.age;}", ctClass));            //获取这个字段            CtField age = ctClass.getField("age");            FieldInfo fieldInfo = age.getFieldInfo();            ConstPool cp = fieldInfo.getConstPool();            AnnotationsAttribute attribute = (AnnotationsAttribute) fieldInfo.getAttribute(AnnotationsAttribute.visibleTag);            //这里进行了判断 如果说当前字段没有注解的时候 AnnotationsAttribute 这个对象是为空的            //所以要针对这个进行新创建 一个 AnnotationsAttribute 对象            if(ObjectUtils.isEmpty(attribute)){                List<AttributeInfo> attributeInfos =fieldInfo.getAttributes();                attribute = !attributeInfos.isEmpty()?(AnnotationsAttribute) attributeInfos.get(0):                        new AnnotationsAttribute(fieldInfo.getConstPool(), AnnotationsAttribute.visibleTag);            }            // Annotation 默认构造方法  typeName:表示的是注解的路径            Annotation bodyAnnot = new Annotation("com.example.demo.excel.annotation.Excel", cp);            // name 表示的是自定义注解的 方法  new StringMemberValue("名字", cp) 表示给name赋值            bodyAnnot.addMemberValue("name", new StringMemberValue("名字", cp));            attribute.addAnnotation(bodyAnnot);            fieldInfo.addAttribute(attribute);            Class aClass1 = ctClass.toClass();            //获取到 新增加的字段            Field cityCode = aClass1.getDeclaredField("age");            //获取 字段上的注解 (这其实可以进行优化 因为有可能 字段上会有多个注解 后续再说)            Excel annotation1 = cityCode.getAnnotation(Excel.class);            String name = annotation1.name();            System.out.println(name);        } catch (Exception e) {            e.printStackTrace();        }    }

亲测有效

来源地址:https://blog.csdn.net/qq_39838930/article/details/126859114

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯