传星 2013-11-17 08:40
浏览 474
已采纳

请教:如何根据字符串中的内容创建对象

public class CreateObj {
public Object createObj(){
String objName = "Person";
Map fieldMap = new HashMap();
fieldMap.put("name", "java.lang.String");
fieldMap.put("age", "int");
return null;
}
}

上面这个类中的createObj方法能根据 objName和filedMap中的值创建一个和
public class Person {
private String name;
private int age;
}
Person person1 = new Person();
相同的对象?

  • 写回答

12条回答 默认 最新

  • stu liu 2013-11-20 15:06
    关注

    [code="java"]
    public Class build(String clsname,String savepath,Collection properties){
    Class clz=null;
    try {
    String className = clsname.replace(".", "/");
    // 创建类信息
    ClassWriter cw = new ClassWriter(0);
    //申明类名 以及 访问修饰符
    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, className, null, "java/lang/Object", null);
    //建立构造函数
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

            FiledInfo filed = null;
            String fileName = null;
            String fileType = null;
    
            Iterator iterator = properties.iterator();
            while(iterator.hasNext()){
                filed = (FiledInfo)iterator.next();
                fileName = WordUtils.capitalize(filed.getName());   // 首字母大写
                fileType = filed.getType().replace(".", "/");;
                //建立属性对应的类变量
                cw.visitField(ACC_PRIVATE, filed.getName(), "L"+fileType+";", null, null).visitEnd();
                // get方法
                mv=cw.visitMethod(ACC_PUBLIC, "get"+fileName, "()L"+fileType+";", null, null);
                mv.visitCode();
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, className, filed.getName(), "L"+fileType+";");
                mv.visitInsn(ARETURN);
                mv.visitMaxs(1, 1);
                mv.visitEnd();
                // set方法
                mv=cw.visitMethod(ACC_PUBLIC, "set"+fileName, "(L"+fileType+";)V", null, null);
                mv.visitCode();
                mv.visitVarInsn(ALOAD, 0);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitFieldInsn(PUTFIELD, className, filed.getName(), "L"+fileType+";");
                mv.visitMaxs(2, 2);
                mv.visitInsn(RETURN);
                mv.visitEnd();
            }
            cw.visitEnd();
            // 输出class文件
            byte[] code=cw.toByteArray();
            if(savepath!=null){
                int pos = savepath.lastIndexOf("\\");
                String dir = savepath.substring(0,pos);
                File directory =new File(dir);
                if (!directory.exists())
                    directory.mkdirs();
                File file = new File(savepath);
                if (file.exists()){
                    file.createNewFile();
                }else{
                    file.delete();
                }
    
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(code);
                fos.close();
            }
            clz = this.defineClass(clsname, code, 0, code.length);
        } catch (Exception e) {
        }
        return clz;
    }
    

    [/code]
    [url]http://name327.iteye.com/blog/1554558[/url]
    [url]http://blog.sina.com.cn/s/blog_7010db8c0100mt04.html[/url]
    [url]http://www.iteye.com/topic/197752[/url]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

悬赏问题

  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)