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

时间:2010-12-16 14:52:01

标签: java reflection constructor javassist

以此代码为例:

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()并设置属性值,因为no-arg构造函数受到保护。

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

怎么做? javassist或其他代理技术有帮助吗?怎么样 ? 非常感谢!

3 个答案:

答案 0 :(得分:3)

您可以使用:

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

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

答案 1 :(得分:1)

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

User u = new User(null, null);

然后在工具中设置属性?

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

您可以生成或多或少原子的代码,因此对您来说无关紧要

答案 2 :(得分:0)

顺序在运行时会是相同的,所以为什么不弄清楚正确的顺序,并将其视为这样。

相关问题