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

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();
相同的对象?

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

不是Class.forName() 吗?

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

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

java tool中应该有相应的工具包
http://mopishv0.blog.163.com/blog/static/54455932201010161162058/

通过反射很容易的吧,

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

反射或者自己写注解

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

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

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

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

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

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字符串生成对象

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

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

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