如何在java中动态创建一个类

我不知道这是否可能。 无论如何,这是我的问题:我想创建一个具有数据库表模式的类,例如假设我有一个像这样的表

id - unsigned int username - varchar(128) password - varchar(128) 

我们假设我可以从我的数据库中查询这些数据。 我想要做的是动态创建(当然,实例化)一个看起来像这样的Java类:

 public class User{ private unsigned int id; private String username; private String password; } 

(实际上是我桌子的ActiveRecord

你能帮我开始吗? TNKS

对于您的其他代码都不知道的动态创建和实例化的类,您会怎么

对于像Java这样的静态类型语言,拥有这样的类是没有意义的。 另一方面,像Hibernate这样的大多数OR Mappers都带有允许您从数据库模式静态生成类的工具。

从技术上讲,您可以通过字节码操作库 – CGLIB,javassist,asm,bcel等。

然而,这不是Java的“哲学”。 Java是静态类型的,因此您最好在运行时之前创建类。

看一下hibernate / eclipseLink for Java ORM – 一种将表映射到对象的方法。

我想你想要的是java.lang.reflect.Proxy和相关类提供的工具。

这是一篇很好的文章,但你确定你需要真正创建一个新类吗? 也许你可以使用一张地图?

与@Bozho状态一样,Java是一种静态类型语言,在运行时生成类只会导致混乱。

在我们的世界中,在构建时生成类更加方便,也就是说在编译期间。 使用Hibernate逆向工程 ,您可以在构建时从数据库模式构建Java类,并在应用程序中部署这些类,从而为您提供真实的Java代码,并保证您的代码将绑定到数据库模式

有关“新”编译器API和Java文档Java编译器的文章介绍了如何从String对象编译java源代码。 (我不知道我们是否可以编译输出流并将类文件加载到内存中……)

您可以稍后使用URLClassLoader加载类文件并创建实例(reclection / invocation API)

是的,可以在运行时编译类。 我之前在遗传算法研究中做过。 它可以使用编译器的内置接口。 Java World上的一篇文章介绍了基本方法: http : //www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html?page = 3

您可以生成Java源文本并使用javax.tools包来编译它,并使用类加载器来加载它。 谷歌搜索产生了一些如何做到的例子,但我从未尝试过这样的事情,所以我不知道你可能会遇到什么问题。 显然,Java不是为这样的东西而设计的。

这是一个很好的基于CGLib的解决方案:

http://code.google.com/p/cglib-wrappers/wiki/Wrappers

我想最终目标是使用类似ActiveRecord的代码来编写数据库访问。 如果是这种情况,您可以查看ActiveRecord的Java实现: http : //code.google.com/p/activejdbc/

干杯,

伊戈尔

旧问题,如果有可能,你应该避免在运行时生成类,但有时你必须这样做。 所以你可以使用Javassist,这是一个例子……

我在这里创建了一个小例子: http : //hrabosch.com/2018/04/08/generate-class-during-runtime-with-javassist/

但这里有一个重点:

 public static Class generateClass(String className, String methodName, String methodBody) throws CannotCompileException { ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.makeClass(className); StringBuffer method = new StringBuffer(); method.append("public void ") .append(methodName) .append("() {") .append(methodBody) .append(";}"); cc.addMethod(CtMethod.make(method.toString(), cc)); return cc.toClass(); } 

所以我做了…通过Javassist我在ClassPool中创建了一个类。 我还在这个类中添加了一个方法,并通过reflection调用它。

希望能帮助到你。

只要记住要在生成的类中使用的任何内容,都没有导入,因此您必须使用完全限定的名称。