Constructor.newInstance() 不知道参数顺序?

发布于 2024-10-08 03:06:53 字数 887 浏览 4 评论 0原文

以这段代码为例:

public class User {
  private String username;
  private String password;

  protected User()
  {}

  public User(String username , String password)
  {...}

  //getters & setters
}

我们可以使用 User.class.getConstructors() 发现有 2 个构造函数,并且使用 constructor.getParameterTypes() ,我们可以识别出有一个具有两个 String 参数的构造函数。 我们还可以使用反射来查找两个属性:用户名和密码。 但是,在运行时,我们不知道用于调用 constructor.newInstance(?,?) 的两个参数的正确顺序。

constructor.newInstance(username , password)constructor.newInstance(password , username) 都是合法的,但结果完全不同。

我无法使用 User.class.newInstance() 并设置属性值,因为无参数构造函数受到保护。

我遇到这个问题是因为我正在尝试编写一个通用的 JPA CRUD 工具。列表/读取/更新/删除都可以。但现在我面临着无法在线创建对象的问题。实体类都带有一个受保护的无参数构造函数(因此我无法使用 class.newInstance()),以及一个多参数公共构造函数(但参数名称在运行时会被删除)。

如何做到这一点? javassist 或其他代理技术有帮助吗?如何 ? 多谢 !

Take this code for example :

public class User {
  private String username;
  private String password;

  protected User()
  {}

  public User(String username , String password)
  {...}

  //getters & setters
}

We can use User.class.getConstructors() and find there are 2 constructors , and with constructor.getParameterTypes() , we can identify there's one constructor with two String parameters.
We can also use reflection to find two properties : username and password.
But , at run time , we don't know the proper sequence of the two parameters being used to call constructor.newInstance(?,?).

constructor.newInstance(username , password) , and constructor.newInstance(password , username) are both legal but with totally different result.

I cannot use User.class.newInstance() and set property value because the no-arg constructor is protected.

I encounter this problem because I am trying to write a generic JPA CRUD tool. List/Read/Update/Delete are OK. But now I face the problem that I cannot online create an object. The entity classes are all with a protected no-arg constructor (so I cannot use class.newInstance()) , and one a-lot-of-parameter public constructor (but the parameter names are erased at runtime).

How to do this ? Does javassist or other proxy-techniques help ? how ?
Thanks a lot !

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

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

发布评论

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

评论(3

计㈡愣 2024-10-15 03:06:53

您可以使用:

Constructor<?> c = class.getDeclaredConstructor();
c.setAccessible(true);
c.newInstance();

这就是 JPA 无论如何都会做的,因为它通过无参数构造函数实例化对象。

You can use:

Constructor<?> c = class.getDeclaredConstructor();
c.setAccessible(true);
c.newInstance();

That's what JPA will do anyway, because it instantiates objects via their no-arg constructor.

浅听莫相离 2024-10-15 03:06:53

这可能只是一种解决方法,但是您不能使用(为了便于阅读,我省略了反射)创建用户

User u = new User(null, null);

,然后在工具中设置属性吗?

u.setUsername(...);
u.setPassword(...);

您可以生成或多或少原子的代码,所以这对您来说并不重要

That might be just a workaround, but couldn't you create the User using (I omit reflection for the purpose of readability)

User u = new User(null, null);

and then set the properties in your tool?

u.setUsername(...);
u.setPassword(...);

You could generate code that is more or less atomic, so it wouldn't matter to you

旧瑾黎汐 2024-10-15 03:06:53

不过,运行时的顺序是相同的,所以为什么不直接找出正确的顺序,并按原样对待它。

The order will be the same at runtime though, so why not just figure out the correct order, and treat it as such.

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