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()、2 つの String パラメーターを持つ 1 つのコンストラクターがあることを識別できます。リフレクションを使用して、ユーザー名とパスワードの 2 つのプロパティを見つけることもできます。しかし、実行時には、constructor.newInstance(?,?) を呼び出すために使用される 2 つのパラメーターの適切な順序はわかりません。

constructor.newInstance(username , password)、およびconstructor.newInstance(password , username)両方とも有効ですが、結果はまったく異なります。

User.class.newInstance()引数なしのコンストラクターが保護されているため、プロパティ値を使用および設定できません。

一般的な JPA CRUD ツールを作成しようとしているため、この問題が発生します。一覧・閲覧・更新・削除OK。しかし今、オンラインでオブジェクトを作成できないという問題に直面しています。エンティティ クラスはすべて、保護された引数なしのコンストラクター (したがって、class.newInstance() を使用できません) と、1 つのパラメーターの多いパブリック コンストラクター (ただし、パラメーター名は実行時に消去されます) を備えています。

これを行う方法 ?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 に答える