2012-11-24 7 views
5

나는 프록시와 함께 Hibernate를 사용하고 있으며, test.DBUser$$EnhancerByCGLIB$$40e99a2d과 같은 클래스에 속한 객체를 얻는다.프록시 클래스에서 프록시 된 클래스를 검색하려면 어떻게합니까?

프록시 클래스에서 기본 클래스 (이 경우 test.DBUser)를 검색하는 Hibernate 메소드가 있습니까? 내가 Hibernate.getClass()에 대해 알고 있지만 걸리는 반면, 나는 입력으로 Class 걸리는 방법을 찾고있다.

+1

왜 처음부터이 것이 필요합니까? 프록시는 기본 클래스를 확장하므로 기본 클래스의 인스턴스에서 호출 할 수있는 모든 메서드를 프록시에서 호출 할 수 있으며 동일한 결과를 반환합니다. –

+0

최대 절전 모드 프록시 개체를 GSON 라이브러리에 전달할 때 또 다른 질문으로이 문제를 조사했습니다. 라이브러리는 구현 자에게 프록시'Class'를 전달하는 호출을 만들고, 나중에 단지 객체'Object'를 호출하고,'Class'를 사용하여 무언가를 할 수 있기를 원합니다. – Flavio

답변

3

필자가 생각한 것보다 쉽다는 것을 알았습니다. 프록시되지 않은 원본 클래스를 얻기 위해 프록시 된 클래스에서 getSuperclass()을 호출하면됩니다. 나는 이것이 얼마나 일반적인지는 모르겠지만 작동하는 것처럼 보입니다.

0

test.DBUser$$EnhancerByCGLIB$$40e99a2d과 같은 클래스는 dynamic proxies입니다. "진짜 계급 뒤에"의 개념은 대부분의 경우별로 의미가 없습니다. 프록시가 생성 될 때마다, 그것은 Hibernate가 정의한대로 모든 클래스의 인스턴스 일 수있다.

당신이 무엇입니까 정말 묻습니다 것은 Map{ Class<Proxy>, Class<RealObject>}입니다. 나는 그런 것이 없다고 믿지 않는다. 나는 이것을 필요로한다고 믿는다.

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는 구현 클래스를 얻기 위해 모든 방법 게으른 초기화로 이동 : 그냥 Hibernate.getClass()의 소스를 봐주세요.

0

이러한 방법은 없습니다. 랩핑 된 오브젝트를 검색하고 이에 따라 프록시 내부에서 클래스 정보를 검색하려면 직접 도우미 클래스를 작성해야합니다. 주어진 시나리오에서 개체 만 필요하면 모든 지연로드를 제거하십시오. Hibernate는 당신에게 평범한 객체를 주어야한다.

개체가 필요하지 않은 것을 고려하십시오. 어쩌면 런타임에 원하는 정보가 들어있는 필드를 추가하는 등 응용 프로그램을 필요하지 않도록 재 설계 할 수 있습니다.

3

Flavio가 게시 한 접근법의 단순함을 정말 좋아하지만 지원되지 않는 한 프로덕션 코드에서 사용할 수 없습니다. 또한 LazyInitializer에서 .getImplementation()을 호출하면 프록시가 초기화되지 않은 경우 강제로 초기화되므로 성능에 부정적인 영향을줍니다. 이 두 가지 문제를 모두 해결하는이 접근법을 제안했습니다.

public static Class<?> getClassForHibernateObject(Object object) { 
    if (object instanceof HibernateProxy) { 
    LazyInitializer lazyInitializer = 
     ((HibernateProxy) object).getHibernateLazyInitializer(); 
    return lazyInitializer.getPersistentClass(); 
    } else { 
    return object.getClass(); 
    } 
} 
관련 문제