2012-11-24 5 views
5

私はプロキシでHibernateを使用していますが、私はtest.DBUser$$EnhancerByCGLIB$$40e99a2dのようなクラスに属するオブジェクトを取得します。プロキシクラスからプロキシクラスを取得するにはどうすればよいですか?

プロキシのクラスからベースクラス(この場合はtest.DBUser)を取得するHibernateメソッドはありますか?私はHibernate.getClass()について知っていますが、Objectが必要ですが、私は入力としてClassを取る方法を探しています。

+1

なぜこれが最初に必要ですか?プロキシは基底クラスを拡張するので、基底クラスのインスタンスで呼び出せるメソッドはすべて、プロキシで呼び出すことができ、同じことを返します。 –

+0

私はこれを、GSONライブラリにハイバネートプロキシオブジェクトを渡す際の別の質問として研究していました。ライブラリは、実装者にプロキシ 'Class'を渡す呼び出しをいくつか行い、後でプロキシ' Object'だけを呼び出し、 'Class'で何かをやりたいと思っていました。 – Flavio

答えて

3

私が見つけた、私が思ったよりも簡単です。私はそれがどれほど一般的かはわかりませんが、うまくいくようです。

0

test.DBUser$$EnhancerByCGLIB$$40e99a2dのようなクラスは、dynamic proxiesです。 「リア・クラスの背後にある」という概念は、ほとんどの場合、あまり意味をなさない。プロキシが作成されるたびに、それはHibernateがそれを定義するどんなクラスのインスタンスでもあります。

あなたが何であるか本当には、Map{ Class<Proxy>, Class<RealObject>}です。私はそのようなことは信じていないし、私はこれが必要であると信じていない。ただ、Hibernate.getClass()のソースを見てみましょう。

339  public static Class getClass(Object proxy) { 
340  if (proxy instanceof HibernateProxy) { 
341   return ((HibernateProxy) proxy).getHibernateLazyInitializer() 
342     .getImplementation() 
343     .getClass(); 
344  } 
345  else { 
346   return proxy.getClass(); 
347  } 
348 } 

をそれは実際のクラスを取得するには、静的なマップの検索を行うにははるかに安くなるだろうが、Hibernateは実装クラスを取得するためにすべての方法怠惰な初期化子に行きます。

0

このような方法はありません。ラップされたオブジェクト、したがってプロキシ内部からクラス情報を取得するためには、ヘルパークラスを自分で記述する必要があります。与えられたシナリオでオブジェクトが必要な場合は、すべての遅延読み込みを削除してみてください。 Hibernateはあなたに平易なオブジェクトを与えます。

オブジェクトを必要としないことを検討してください。たとえば、実行時に必要な情報が含まれているフィールドを追加するなど、必要のないようにアプリケーションを再設計することができます。ただunproxied、元のクラスを取得するためにプロキシクラスにgetSuperclass()を呼び出す:

3

それが文書化されていますしない限り、サポートされて私は本当にフラビオにより投稿されたアプローチの単純さと同じように、私は、生産コードでそれを使用することはできませんが。また、LazyInitializerで.getImplementation()を呼び出すと、プロキシがまだ初期化されていない場合は強制的に初期化され、パフォーマンスに悪影響を及ぼします。私はこれらの懸念に対処するこのアプローチを考え出しました:

public static Class<?> getClassForHibernateObject(Object object) { 
    if (object instanceof HibernateProxy) { 
    LazyInitializer lazyInitializer = 
     ((HibernateProxy) object).getHibernateLazyInitializer(); 
    return lazyInitializer.getPersistentClass(); 
    } else { 
    return object.getClass(); 
    } 
} 
関連する問題