Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中动态创建类_Java_Class_Dynamic - Fatal编程技术网

在Java中动态创建类

在Java中动态创建类,java,class,dynamic,Java,Class,Dynamic,我想基于XML配置文件中定义的字段,用Java创建一个类: 例如:如果XML文件包含(语法已被恶意攻击以进行发布): 然后,它将在内部创建一个类事件,例如客户端可以实例化的事件(stringagenthost,stringsubsystem)。注意:客户机总是知道该类将被称为“事件”,但不知道需要传递多少“必需参数” 另一方面,如果我有一个包含以下内容的XML文件: <property name="agent_host"></property> 然后它将创建客户

我想基于XML配置文件中定义的字段,用Java创建一个类: 例如:如果XML文件包含(语法已被恶意攻击以进行发布):


然后,它将在内部创建一个类事件,例如客户端可以实例化的事件(stringagenthost,stringsubsystem)。注意:客户机总是知道该类将被称为“事件”,但不知道需要传递多少“必需参数”

另一方面,如果我有一个包含以下内容的XML文件:

<property name="agent_host"></property>


然后它将创建客户端可用于实例化的事件(String eventHost)。

这不是您真正想要的类,而是数据。为什么不使用hashmap呢?我真的不喜欢“Bean”风格的类——它们鼓励糟糕的编码(在生成的类中没有放置实际代码的位置,所以所有东西最终都会被外部代码操纵)

您可以从XML中加载一个hashmap并将其注入到一个真实的对象中--这样您就不必担心实际传递散列,您传递的是一个具有真实业务方法和真实类型安全性的真实对象--只是碰巧在内部使用hashmap来存储数据而不是成员变量

我所做的远不止这些,但在某种程度上,你会意识到Hibernate可以为你做任何你想做的事情。

我认为来自Commons的BeanUtils可能就是你想要的

DynaBean是一个Java对象,它支持可以动态修改其名称、数据类型以及值的属性。BeanUtils包的其他组件将尽可能地识别这些bean,并将它们视为标准JavaBeans,以便检索和设置属性值


是的,您可以使用反射,但我想到的是使用一个可以添加属性的类。 假设一个类有一个封装的HashMap,使用字符串作为键(用于属性名)和属性值,这样您就可以读取XML文件,并为evey属性向类添加属性,如。 对于这一行:

<property name="subsystem" type="String">value123</property>


GenericClass c = new GenericClass();
c.addAttribute("subsystem", new String("value123"));
//and you could implement a get and set methods like this:
public String getAttributeValue(String attributeName)
{
   return internalHashMap.get(attributeName).toString();
}
value123
GenericClass c=新的GenericClass();
c、 addAttribute(“子系统”,新字符串(“value123”);
//您可以实现如下的get和set方法:
公共字符串getAttributeValue(字符串attributeName)
{
返回internalHashMap.get(attributeName.toString();
}
使用它,您还可以实现setAttributeValue
这将非常简单,我认为

如果您真的对动态创建类感兴趣,请尝试使用Apache之类的字节码增强库。

是否要生成用于静态编译的代码(java文件)?或者您想在运行时生成代码?代码(类事件)应该在运行时可用。在这种情况下,类的用户将如何实例化它(因为他们没有编译时引用)?你预计他们会使用反射吗?那会有用的。。反射但他们已经知道需要创建类事件的实例。为了简化,类事件构造函数所需的参数数量应该等于XML文件中属性字段的数量。确切地说,他们已经知道需要创建名为“Event”的类的实例,这是完全不同的。我倾向于同意下面的@Bill,这对您或您的消费者来说都不是一个愉快的体验。您能详细说明一下动态生成这个类比使用像map这样的松散数据结构有什么好处吗?为什么是hashMap?我也可以使用链接列表来实现这一点?请注意:setAttributeValue()的简单实现可能会允许类的用户为XML中未定义的属性设置值,从而创建它们。这可能是一个问题,取决于OP的需要。是的,我知道,所以当您试图设置一个不存在的属性时,应该抛出一个异常,我认为一个异常就可以了。。。是的,还有一个Hashmap,这样你就可以用属性名的值来映射属性名。可以使用LinkedList,但必须创建一个封装属性名称和值的类。所以,使用Hashmap,简单得多,谢谢。我有一个类似的问题,并即将过度工程的方式很多。简单的类通过一些助手方法扩展一个映射就可以了!如果值有不同的类型,比如一些是整数,一些是字符串,一些是双精度。如果类型信息只是数据,而不是直接在代码中使用,那么类型不应该由语言强制执行,这是没有意义的。如果需要类型信息,请将其作为更多数据进行跟踪。如果要在代码中使用它,那么在我所看到的每种情况下,使用bean模式都会导致糟糕的代码,那么应该使用带注释的hibernate对象——一个可以包含业务逻辑而不仅仅是bean的对象。
<property name="subsystem" type="String">value123</property>


GenericClass c = new GenericClass();
c.addAttribute("subsystem", new String("value123"));
//and you could implement a get and set methods like this:
public String getAttributeValue(String attributeName)
{
   return internalHashMap.get(attributeName).toString();
}