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);
通过jaxb解析xml字符串生成对象
可以用自定义类加载器,将.class 加载进内存然后得到 class字节码
然后用反射 new 出来就可以了。
可以用groovy,但是我个人觉得这种想法和java有点格格不入