2012-10-09 2 views
0

현재 런타임에 클래스를 동적으로로드하고이를 지원하는 함수 라이브러리를 작성하는 프로그램에서 작업하고 있습니다. 이러한 함수 중 하나는 지정된 클래스 이름에 대해 주어진 jar 파일을 쉽게 검색하고 주어진 초기화 인수 세트에서 새 인스턴스를 작성하는 메소드입니다.생성자 : 인수 목록에서 형식 목록 가져 오기

문제는 인수입니다. 클래스 유형 집합에 대한 클래스의 생성자를 찾는 방법을 알고 있지만 인수 목록을 허용하는 생성자를 찾는 것은 어렵습니다. 나의 첫 번째 생각은 인수를 반복하고 각각에 대해 getClass()을 호출하는 것이었지만 일부 생성자에 대해 유효한 인수가 될 수있는 null 인수는 무엇입니까?

주어진 인수 집합에 대해 올바른 생성자를 찾는 현명한 방법이 있습니까?

참고 : 표준 Java 만이 공동 프로젝트이므로 Java 파생 언어 및 타사 라이브러리를 사용할 수 없습니다.

답변

2

Reflection API 튜토리얼을 보셨습니까 ?? 그것은 당신이 paraemterTypes의 순서를 기억할 필요가 무엇

private final boolean checkConstructor(Class<?> type, Class<?>... parameterTypes) { 

     try { 
      forName.getConstructor(parameterTypes); 
      return true; 
     }catch(NoSuchMethodException e) { 

     } 

     return false; 
    } 

이 중요 정확히 당신이 원하는에 대한 구현 ..

+0

또한 ClassLoader에 대한 메모를 추가 할 수 있습니다 –

+0

클래스 로딩을 처리 할 수 ​​있으며 과거에 사용했습니다. 동적으로 로딩 할 의도가있는 함수의 대부분은 빈 생성자를 사용한 다음 초기화 함수 (응용 프로그램에 따라 다름)를 사용합니다. 그러나 라이브러리를 사용하고 있으므로 현재 작성하고 있습니다. 계속 유지하려고합니다. 융통성이 있습니다. –

1

당신이 당신의 문제에 대한 하나의 방법을 사용할 수 있습니다, 리플렉션 API 튜토리얼을 통과 한 후이있다 .

매개 변수 유형을 알지 못하는 생성자를 호출하는 곳을 지정해서는 안됩니다. 동일한 규칙이 생성자에서 null을 사용해서는 안되는 코드 스타일에 적용됩니다.

+0

당신은 클래스를 얻는다는 것을 의미하고, null (해결되지 않음)이 있고 시도하고 잡을 수 있으면 클래스를 거부한다는 의미입니까? 나는 그것을 나의 백업 솔루션으로 생각했지만보다 우아한 솔루션이 있는지 알고 싶어했습니다. –

0

getClass()는 올바른 접근 방식입니다. 모든 접근 가능한 생성자를 반복하고 Choosing the Constructor and its Arguments의 정신에 따라 행동하는 가장 구체적인 것을 선택해야합니다. 0 또는> 1 생성자가 발견되면 예외를 던지고 Determine Method Signature처럼 boxing/unboxing을 포함해야합니다. 널 (null) 때문에 문자 그대로 그 알고리즘을 구현할 수는 없지만 가능하면 가깝게 유지해야합니다.