以此代码为例:
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或其他代理技术有帮助吗?怎么样 ? 非常感谢!
答案 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)
顺序在运行时会是相同的,所以为什么不弄清楚正确的顺序,并将其视为这样。