zoukankan      html  css  js  c++  java
  • java ASM动态生成类

    BeanTest2.java

    import java.io.FileOutputStream;
    
    import org.objectweb.asm.AnnotationVisitor;
    import org.objectweb.asm.ClassWriter;
    import org.objectweb.asm.FieldVisitor;
    import org.objectweb.asm.MethodVisitor;
    import org.objectweb.asm.Opcodes;
    
    public class BeanTest2 extends ClassLoader implements Opcodes{
    
        public static void main(String []args) throws Exception
        {
            ClassWriter cw = new ClassWriter(0);
            //类名
            cw.visit(V1_7, ACC_PUBLIC, "com/xxx/model/_766ComLeakInfo", null, "com/xxx/model/LeakInfo", null);
            //注释
            AnnotationVisitor  av = cw.visitAnnotation("Lorg/springframework/data/mongodb/core/mapping/Document;", true);
            //注释参数
            av.visit("collection", "uc_members");
            av.visitEnd();
            //构造函数
            MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null,null);
            mw.visitVarInsn(ALOAD, 0);
            mw.visitMethodInsn(INVOKESPECIAL, "com/xxx/model/LeakInfo", "<init>", "()V");
            mw.visitInsn(RETURN);
            mw.visitMaxs(1, 1);
            mw.visitEnd();
            
            
            //字段
            FieldVisitor  fv = cw.visitField(ACC_PUBLIC, "description", "Ljava/lang/String;", null, null);
            fv.visitEnd();
            
            byte[] code = cw.toByteArray();
            
             //将二进制流写到本地磁盘上
           FileOutputStream fos = new FileOutputStream("E:/asm/bin/com/xxx/model/_766ComLeakInfo.class");
           fos.write(code);
           fos.close();
            
           BeanTest2 loader = new BeanTest2();
            Class<?> clazz = loader.defineClass(null, code, 0, code.length);
            Object beanObj = clazz.getConstructor().newInstance();
            
            clazz.getField("description").set(beanObj, "Adobe客户信息泄露!");
            
            String nameString = (String) clazz.getField("description").get(beanObj);
            System.out.println("filed value : " + nameString);
        }
    }

     LeakInfo.java

    import java.io.Serializable;
    
    import org.springframework.data.mongodb.core.mapping.Document;
    
    @SuppressWarnings("serial")
    @Document
    public class LeakInfo implements Serializable{
        
        //@Id
        long id;
        String type;
        String username;
        String email;
        String password;
        String source;
        String description;
        
        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }
            
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getSource() {
            return source;
        }
        public void setSource(String source) {
            this.source = source;
        }
        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
        
    }

    生成类

    import org.springframework.data.mongodb.core.mapping.*;
    
    @Document(collection = "uc_members")
    public class _766ComLeakInfo extends LeakInfo
    {
        public String description;
    }
  • 相关阅读:
    008 同步
    007 优雅的关闭线程
    006 线程中的join方法
    005 线程ID和线程的优先级
    004 后台线程
    003 Thread的构造
    群发 图片和语音失败原因是 ,返回 content是 null,
    状态,
    Shape Of My Heart
    转码 的状态,嘿嘿,小bug,少了一个 !
  • 原文地址:https://www.cnblogs.com/passedbylove/p/7830745.html
Copyright © 2011-2022 走看看