传星 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 怎样才能让鼠标沿着线条的中心线轨迹移动
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?