• 尚学堂 216 java中的字节码操作


    所谓的字节码操作就是操作我们已经加载的字节码

    接下来我们重点来讲解javaassist类库

    使用需要下载jar包,把jar包添加到对应的工程之后

    package com.bjsxt.test;
    
    
    public class Emp {
        
        private int empno;
        private String ename;
        
        public void sayHello(int a){
            System.out.println("sayHello,"+a);
        }
        
        public int getEmpno() {
            return empno;
        }
        public void setEmpno(int empno) {
            this.empno = empno;
        }
        public String getEname() {
            return ename;
        }
        public void setEname(String ename) {
            this.ename = ename;
        }
        
        public Emp(int empno, String ename) {
            super();
            this.empno = empno;
            this.ename = ename;
        }
        
        public Emp() {
        }
    }

    我们使用javaAssit工具手动的创建一个Emp .class文件

    我们来看程序的代码

    package com.bjsxt.test;
    
    import javassist.CannotCompileException;
    import javassist.ClassPool;
    import javassist.CtClass;
    import javassist.CtConstructor;
    import javassist.CtField;
    import javassist.CtMethod;
    
    /**
     * 测试使用javassist生成一个新的类
     * @author 尚学堂高淇 www.sxt.cn
     *
     */
    public class Demo01 {
        public static void main(String[] args) throws Exception {
            ClassPool pool = ClassPool.getDefault();
            CtClass cc = pool.makeClass("com.bjsxt.bean.Emp");
            
            //创建属性
            CtField f1 = CtField.make("private int empno;", cc);
            CtField f2 = CtField.make("private String ename;", cc);
            cc.addField(f1);
            cc.addField(f2);
            
            //创建方法
            CtMethod m1 = CtMethod.make("public int getEmpno(){return empno;}", cc);
            CtMethod m2 = CtMethod.make("public void setEmpno(int empno){this.empno=empno;}", cc);
            cc.addMethod(m1);
            cc.addMethod(m2);
            
            //添加构造器
            /*
             * CtClass.intType,pool.get("java.lang.String 构造函数的int和string类型
            */
            CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")}, cc);
            constructor.setBody("{this.empno=empno; this.ename=ename;}");
            cc.addConstructor(constructor);
            
            cc.writeFile("c:/myjava"); //将上面构造好的类写入到c:/myjava中
            System.out.println("生成类,成功!");
        }
    }

    我们运行上面的代码,就在c盘生成了 一个Emp .class文件

  • 相关阅读:
    面试题-代码
    面试题-数仓
    烂大街的NginxRedisMqDb架构.md
    Ansible-B站.md
    openstack.md
    rabbitMQ.md
    大数据仓库实战项目-电商数仓3.0版.md
    linux分析工具之top命令详解
    小程序开发中 在 wxml格式化 属性断行
    redhat 7.2更新yum源时踩的坑
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/7285351.html
Copyright © 2020-2023  润新知