不知道Java能不能做到这种功能:
在程序运行的时候通过一个xml文件(类似于hibernate的实体配置文件)生成其对应的实体类,并能在程序中使用?
我想应该和Java的反射机制有关系,但反射好像只能针对已经存在的Java类。

解决方案 »

  1.   

    我现在正在研究CASTOR,它好像也不行,也得有个写好的和xml文件对应的类
      

  2.   

    当然可以,参照俺其他的关于classloader的回复。
      

  3.   

    生成实体类是可以,有很多开源的动态生成class的项目,利用它们都可以做到。
    但是如何在程序中使用倒是个问题,因为你写程序的时候引用不了它。
      

  4.   

    如果动态生成并加载了,我应该可以用反射机制得到和使用它吧。
    taolei:能具体说几个开源项目不?
    chen09:就搜索classloader就能找到你原来的回复?
      

  5.   

    我不知道是否有完全满足你的问题要求的项目。
    但是重技术上应该是完全做得到的。
    http://www.open-open.com/54.htm
    有很多java字节码操作的开源项目,可以用来动态生成class.通常情况下动态生成的class都实现某个特定的接口,扩继承某个特定的基类。
    然后在程序中通过特定的接口或基类来访问。
    很多应用服务器的EJB stub类都是这样创建的。
      

  6.   

    在程序运行的时候通过一个xml文件(类似于hibernate的实体配置文件)生成其对应的实体类,并能在程序中使用? 
    这个要看你的类在生成怎样代码。如果只是一个数据Bean,只是动态生成getter/setter,然后在主程序中利用反射机制再调用这些方法的话
    你可以简单利用CGLIB来完成:
    import java.lang.reflect.Method;import net.sf.cglib.core.ClassGenerator;
    import net.sf.cglib.core.DefaultGeneratorStrategy;
    import net.sf.cglib.proxy.*;
    import net.sf.cglib.transform.TransformingClassGenerator;
    import net.sf.cglib.transform.impl.AddPropertyTransformer;import org.objectweb.asm.Type;public class TestCGLib implements MethodInterceptor {
    public static void main(String[] args) throws Exception {
    Enhancer e = new Enhancer();
    e.setSuperclass(Object.class);
    e.setCallback(new TestCGLib());
    e.setStrategy(new DefaultGeneratorStrategy() {
    protected ClassGenerator transform(ClassGenerator cg) {
    return new TransformingClassGenerator(
    cg,
    new AddPropertyTransformer(
    new String[] { "XX" },//这个地方根据你的Xml来构造相应的名称和类型
    new Type[] { Type.INT_TYPE }
    )
    );
    } });
    Object o = e.create();
    System.out.println(o.getClass().getMethod("setXX", new Class[]{int.class}).invoke(o, 123));
    System.out.println(o.getClass().getMethod("getXX").invoke(o));
    } public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable {
    return null;
    }
    }
      

  7.   

    恩对,就是只是当个DataBean,只有set/get方法
      

  8.   

    这样做太过于杀鸡取蛋了!批量倒入数据,看中的是性能——最好是直接用SQL操作。
      

  9.   

    楼主没有说是批量导入数据吧,只是说根据XML动态生成一个对象罢了,这个与SQL何关?
    不过事实上,如果只是getter/setter的数据Bean,你还不如直接使用Map的方便。老反射调用代码都也得烦人
      

  10.   

    其实这个想法是源于我要把Excel内的数据导到数据库中(Excel有好多,每个都对应不同的表,也可能一个Excel文件对应多个表).
    这个功能当然我是不会把它放到一个Bean中再放入数据库中的.
    但我想把它做的通用点.比如,以后我不是要保存到数据库,而是要得到这个对象,再在上面做些处理呢?
    那么我会碰到不同的表(DataBean)那么就用个配置文件去定义这个类,再动态的生成在程序中调用.
    我就是这么想的.不知道对不对或有什么不好的地方还请大家多多帮助.