不知道Java能不能做到这种功能:
在程序运行的时候通过一个xml文件(类似于hibernate的实体配置文件)生成其对应的实体类,并能在程序中使用?
我想应该和Java的反射机制有关系,但反射好像只能针对已经存在的Java类。
在程序运行的时候通过一个xml文件(类似于hibernate的实体配置文件)生成其对应的实体类,并能在程序中使用?
我想应该和Java的反射机制有关系,但反射好像只能针对已经存在的Java类。
但是如何在程序中使用倒是个问题,因为你写程序的时候引用不了它。
taolei:能具体说几个开源项目不?
chen09:就搜索classloader就能找到你原来的回复?
但是重技术上应该是完全做得到的。
http://www.open-open.com/54.htm
有很多java字节码操作的开源项目,可以用来动态生成class.通常情况下动态生成的class都实现某个特定的接口,扩继承某个特定的基类。
然后在程序中通过特定的接口或基类来访问。
很多应用服务器的EJB stub类都是这样创建的。
这个要看你的类在生成怎样代码。如果只是一个数据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;
}
}
不过事实上,如果只是getter/setter的数据Bean,你还不如直接使用Map的方便。老反射调用代码都也得烦人
这个功能当然我是不会把它放到一个Bean中再放入数据库中的.
但我想把它做的通用点.比如,以后我不是要保存到数据库,而是要得到这个对象,再在上面做些处理呢?
那么我会碰到不同的表(DataBean)那么就用个配置文件去定义这个类,再动态的生成在程序中调用.
我就是这么想的.不知道对不对或有什么不好的地方还请大家多多帮助.