如何以编程方式从文件中的值实例化动态加载的类?

发布于 2024-12-12 05:28:38 字数 431 浏览 0 评论 0原文

我对 Java 的反射 API 有基本的了解 - 因此,这不仅是如何实现的问题,而且是是否可能以及我是否正在以最佳方式寻求解决方案的问题。

我们正在对多个相互关联的项目进行一些验收测试;这些项目中的每一个都使用内部抽象 API 从 MongoDB 存储中检索数据。为了促进此测试,每个组件都需要在数据库中提供一些预加载的数据。

我正在构建一个命令行工具来接受 DTO(预编译的类二进制文件),以便使用 morphia ORM 库加载多个实例。我希望我们团队的每个成员都能够运行生成器,通过 cli 传入其 DTO(以 jar 或目录形式),以及用于实例化所需数量的记录的文件(csv 或其他形式)。

我的类加载工作与 URLClassLoader 配合良好。现在我尝试使用文件中的数据实例化此类的实例。

这可能吗?序列化对象是更好的方法吗?

I have basic knowledge of Java's reflection API - therefore, this is not only a question of how, it's a question of whether it's possible and whether I'm going about a solution the best way.

We're doing some acceptance testing of multiple, interrelated projects; each of these projects retrieve data from a MongoDB store using an in-house abstraction API. To facilitate this testing, each component needs some pre-loaded data to be available in the database.

I'm building a command-line tool to accept a DTO (pre-compiled class binary), for loading of multiple instances using the morphia ORM library. I would like each member of our team to be able to run the generator passing in via cli their DTO (in jar or directory form), and a file (csv or otherwise) for instantiating a desired amount of records.

I have the class loading working fine with URLClassLoader. Now I'm trying to instantiate an instance of this class using data from a file.

Is this possible? Would serialized objects be a better approach?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

赠佳期 2024-12-19 05:28:38

使用 Java Reflection API 完全可以做到这一点:

  • 按名称加载类实例(Class.forName(className),您实际上并不需要 ClassLoader 实例)
  • 抓取具有参数的构造函数的构造函数实例并调用 newInstance(Object... args)此构造函数实例用于创建 DTO 类的实例。
  • 在您的 Class 实例上调用 getDeclaredFields() 并迭代它们以设置它们的值 (field.set(instance, value))。确保调用 field.setAccessible(true) 才能访问私有字段。

That's perfectly possible using the Java Reflection API :

  • Load Class instance by name (Class.forName(className), you don't really need the ClassLoader instance)
  • Grab Constructor instance of constructors have parameters and invoke newInstance(Object... args) on this constructor instance to create an instance of your DTO class.
  • Invoke getDeclaredFields() on your Class instance and iterate over them to set their values (field.set(instance, value)). Make sure to invoke field.setAccessible(true) to be able to access private fields.
深海不蓝 2024-12-19 05:28:38

如果“序列化对象”指的是固定实例,那么不,通过从文本文件加载属性,您可以更轻松地调整测试数据(如果这是一个目标),包括对象的数量。

但当然,这是可能的;从输入文件中解组数据,并使用它来初始化或构造有问题的对象,就像在常规代码中一样。

If by "serialized objects" you mean canned instances, then no, by loading properties from a text file you allow much easier tweaking of test data (if that's a goal), including the number of objects.

But sure, it's possible; unmarshal the data from the input file and use it to initialize or construct the object in question like you would in regular code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文