Constructor.newInstance() 不知道参数顺序?
以这段代码为例:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用:
这就是 JPA 无论如何都会做的,因为它通过无参数构造函数实例化对象。
You can use:
That's what JPA will do anyway, because it instantiates objects via their no-arg constructor.
这可能只是一种解决方法,但是您不能使用(为了便于阅读,我省略了反射)创建用户
,然后在工具中设置属性吗?
您可以生成或多或少原子的代码,所以这对您来说并不重要
That might be just a workaround, but couldn't you create the User using (I omit reflection for the purpose of readability)
and then set the properties in your tool?
You could generate code that is more or less atomic, so it wouldn't matter to you
不过,运行时的顺序是相同的,所以为什么不直接找出正确的顺序,并按原样对待它。
The order will be the same at runtime though, so why not just figure out the correct order, and treat it as such.