weixin_42497474
传星
2013-11-17 08:40

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

已采纳

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条回答

  • weixin_42509472 stu liu 8年前

    [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]

    点赞 评论 复制链接分享
  • u011775598 wwwxxxasd 8年前

    可以用自定义类加载器,将.class 加载进内存然后得到 class字节码

    然后用反射 new 出来就可以了。

    点赞 评论 复制链接分享
  • RabbitBoy2006 RabbitBoy2006 8年前

    class Persion{
    String name;
    int age;
    @XmlAttribute
    public String getName() {return name};
    public void setName(...){...}

    @XmlAttribute
    public String getAge(){return age};
    public void setAge(...){...};
    }

    String xml = "<?xml version=\"1.0\">";

    ByteArrayInputStream inStream = new ByteArrayInputStream(xml.getBytes());
    JAXBContext jc = JAXBContext.newInstance(Persion.class);
    StreamSource xml = new StreamSource(inputStream);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    JAXBElement je1 = unmarshaller.unmarshal(xml, pclass);

    Persion persion = je1.getValue();

    通过jaxb解析xml字符串生成对象

    点赞 评论 复制链接分享
  • mingxuxu mingxuxu 8年前

    应该更多的关于字符串是怎么来的,个人感觉貌似就是一个序列化和反序列化的问题,如果是这样的话就很容易了:

    可以考虑Java序列化机制&Jason以及其他方式(比如XML方式)

    对象-->字符串: 序列化:ObjectOutputStream.writeObject(obj) --> 字节码,需要的话可转
    Jason:gson.toJason(obj)

    字符串-->对象
    反序列化:ObjectInputStream.readObject();
    Jason:gson.fromJason(string);

    点赞 评论 复制链接分享
  • weixin_42509472 stu liu 8年前

    可以使用asm包生成代码
    我们项目中的表单生成后台就是使用ams来生成java bean的
    给个参考
    [url]http://www.cnblogs.com/liuling/archive/2013/05/25/asm.html[/url]

    点赞 评论 复制链接分享
  • tank2140896 tank2140896 8年前

    反射或者自己写注解

    点赞 评论 复制链接分享
  • wen19851025 wen19851025 8年前

    你是要动态编译还是要动态加载对象?

    点赞 评论 复制链接分享
  • authcode1 authcode1 8年前

    通过反射很容易的吧,

    点赞 评论 复制链接分享
  • lg70124752 lg70124752 8年前
    点赞 评论 复制链接分享
  • iteye_7589 iteye_7589 8年前

    在没有声明 Person这个类的情况下动态创建?
    两种做法,一种找bytecode生成库。动态定义并创建。
    另一种是运行时生成一份类的文本,然后,编译这个类,并且加载。
    (eclipse好像内嵌了一个小的java class编译包)

    可能用groovy这种基于java的Script更方便点吧。
    groovy底层就是实现楼主的目标了。

    点赞 评论 复制链接分享
  • lygoing lygoing 8年前

    不是Class.forName() 吗?

    点赞 评论 复制链接分享
  • weixin_42573547 weixin_42573547 7年前

    可以用groovy,但是我个人觉得这种想法和java有点格格不入

    点赞 评论 复制链接分享

相关推荐