1

以这段代码为例:

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(),我们可以识别出有一个带有两个字符串参数的构造函数。我们还可以使用反射找到两个属性:用户名和密码。但是,在运行时,我们不知道用于调用构造函数.newInstance(?,?) 的两个参数的正确顺序。

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

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

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

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

4

3 回答 3

3

您可以使用:

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

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

于 2010-12-16T14:56:13.413 回答
1

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

User u = new User(null, null);

然后在您的工具中设置属性?

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

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

于 2010-12-16T14:56:09.037 回答
0

不过,在运行时顺序将是相同的,所以为什么不找出正确的顺序,然后这样对待它。

于 2010-12-16T14:58:21.800 回答