2011-05-08 4 views
3

서비스 컨테이너를 만들려고하고 메서드가 호출 될 때 사용되는 형식을 반영하는 방법을 알고 싶습니다. 아래 참조 :Java - 메서드의 일반 형식을 가져 오는 반사

public class ServiceContainer { 

    HashMap<Type, Object> services; 

    public ServiceContainer() { 
     services = new HashMap<Type, Object>(); 
    } 

    public <T> void addService(Type t, T object) { 
     services.put(t, object); 
    } 
    public <T> void addService(T object) { 
     Type type = typeof(T); 
     services.put(type, object); 
    } 
} 

두 번째 addService를 사용하고 싶지만 다시 사용할 수없는 경우 다시 사용해야합니다.

편집 : 나는 addService에 대한 해결책을 찾은 것 같아요,하지만 지금은 같은 방법으로 해결할 수없는 또 다른 방법이있다 :

public class ServiceContainer { 
    HashMap<Class, Object> services; 

    public ServiceContainer() { 
     services = new HashMap<Class, Object>(); 
    } 

    public <T> void addObject(T object) { 
     Class type = object.getClass(); 
     services.put(type, object); 
    } 
    public <T> boolean containsService() { 
    } 
    public <T> T getService() { 
     services.get(
     ServiceContainer.class.getMethod("getService", null) 
      .getGenericParameterTypes()[0]); 
    } 
} 

나는 종류의 지금 어둠 속에서 촬영 해요, 내가 어떤 문서에서 솔직히 말해야합니다 ...

답변

5

두 번째 addService는 클래스 이름 (예 : Type)에 매핑하지 않으면 불가능합니다. 자바 제네릭 컴파일 후 "삭제"때문에

public class ServiceContainer { 
HashMap<Class, Object> services; 

public ServiceContainer() { 
    services = new HashMap<Class, Object>(); 
} 

public <T> void addService(Class<T>, T object) { 
    services.put(t, object); 
} 
public <T> void addService(T object) { 
    Class type = object.getClass(); 
    services.put(type, object); 
} 
} 

이유 typeOfT() 나던 작품이다. ocmpiler가 형식 지정에서 명백한 오류를 검사하는 데 사용하는 것은 실제로 '구문 설탕'뿐입니다.

편집 : 질문이 변경된 이후 다음 containsService 방법을 구현 :

public boolean containsService(String classname) { 
    return services.get(Class.forName(classname)) != null; 
} 
나는 당신이하고있는 것은 매우 일반적이다 주어진,라고 말하고 싶지만

, 당신은 의존성 주입을 사용하는 방법으로 봐 라이브러리를 사용하여 서비스 등록 및 검색을 수행하십시오. Springgoogle Guice에 관한 좋은 점을 들었습니다.

+1

containsService에 응답하는 방법은 무엇입니까? 클래스와 유형의 차이점은 무엇입니까? 자바 문서는 다소 모호합니다. –

+0

클래스 리터럴 (예 : MyService.class) 또는 클래스 이름까지 containsService 메소드로 전달합니다. – Chii

+0

Type이 무엇을 의미하는지 모르겠다. 나는 당신이 서비스의 유형을 지정하는 자신이 작성한 클래스라고 생각했다. (http://download.oracle.com/javase/1,5.0/docs/을 의미하지 않는다면) api/java/lang/reflect/Type.html - 귀하의 경우 유용하지 않을 것입니다. – Chii

관련 문제