나는 현재 질문과 관련이없는 것을 처리 할 수있는 유틸리티 인 라이브러리를 만들고 있지만 (나는 그것이 정말로 중요하지 않기 때문에 암시 적으로 주제를 말하지 않는다), 그러나 그것은 반사를 사용한다.
클래스에서 선언되고 상속 된 모든 메서드를 검색하고 있는데, 현재 제대로 작동하고 문제가 아닙니다. 그러나 문제는 하위 클래스에 대해서도 동일한 메서드를 상속하므로이 작업을 수행해야합니다 (하지만 유사한 메서드를 재정의 할 수는 없음).
나는 그것이 동일한 알고리즘을 사용하는 대신 호출하는 차이가있을 것이라는 점을 직면하고 있다는 문제 clazz.getDeclaredMethods()
내가 호출해야합니다 clazz.getMethods
. 이것에도 접근하는 가장 좋은 방법은 무엇이며 메서드 서명에서도 Class [] 및 Method []를 반환해야합니다.
일반적으로 공유 된 수퍼 클래스를 찾지 만이 경우에는 Class []와 Method []를 그에 따라 선호합니다. 우선 몇 가지 조사를했고 공유 된 수퍼 클래스를 찾았습니다.
Class [] 및 Method [] 배열이 모두 필요하기 때문에 제네릭과 같은 것을 생각하고 있으므로 메서드는 다음과 같습니다.
public static <T extends GenericDecleration> T[] getT () { }
dasblinkenlight에서 언급했듯이 메서드가 인수를 취하지 않고 Class 또는 Method 개체를 검색할지 여부를 확인할 수 없기 때문에 작동하지 않습니다.
하지만 전화가 필요한지 getDeclaredMethods
또는 전화해야하는지 어떻게 알 수 getDeclaredClasses
있습니까?
많은 코드를 복제하지 않고이를 수행하는 가장 좋은 방법은 무엇입니까? 나는 정말로 여기에서 나 자신을 설명하려고 노력했지만 여전히 내가 뭘하고 있는지 확실하지 않다면 언제든지 물어보십시오!
미리 감사드립니다!
이것을 엉망으로 만든 후, 나는 내 요구에 완전히 맞는 솔루션을 찾았습니다. 이것은 제네릭과 @dasblinkenlight의 솔루션의 조합입니다.
public interface DeclExtractor<T extends GenericDecleration> {
public T[] extract (Class clazz);
public Class<? extends T[]) getGenericClass ();
DeclExtractor<Method> methodExtractor = new DeclExtractor<Method>() {
@Override
public Method[] extract (Class clazz) {
return clazz.getDeclaredMethods();
}
@Override
public Class<? extends Method[]> getGenericClass () {
return Method[].class;
}
}
// Same for Class
}
이제 올바른 유형을 반환하는 메소드이므로 모든 GenericDeclaration을 원래 객체 유형으로 수동으로 캐스팅 할 필요가 없습니다. 내 문제는 올바른 배열이 아닌 컬렉션을 사용했다는 것입니다.
public <T> T[] getAll (final DeclExtractor<T> extractor, Class<?> clazz) {
T[] declaration = extractor.extract (clazz);
//.. The algorithm..
// Return an instance of a collection as array (I use a set in my implementation)
final Object[] objects = myCollection.toArray();
return Arrays.copyOf(objects, objects.length, extractor.getGenericClass());
}
기술적 getGenericClass
으로는 인터페이스 에서 메서드 가 필요하지 않지만 extract
루프에서 직접 사용 하므로 클래스를 가져올 수는 없지만 할 수 있습니다. 바라건대 이것은 미래의 누군가에게 도움이되기를 바랍니다 :) 영감을 주신 @dasblinkenlight에게 다시 한 번 감사드립니다!
귀하의 getT
요구는 무엇을 결정하기 위해 몇 가지 입력을 얻을 수 있습니다.
enum
클래스 또는 메서드를 가져와야하는지 여부를 결정하기 위해 인수로 사용할 수있는 메서드는 어떻습니까? ( 댓글에서 )
더 나은 접근 방식이 있습니다. 적절한 추출을 수행하는 인터페이스를 정의하고 두 개의 인스턴스를 만듭니다. 하나는 클래스 추출 용이고 다른 하나는 추출 방법 용입니다.
public interface DeclExtractor {
GenericDecleration[] extract(Class cl);
final DeclExtractor forClasses = new DeclExtractor() {
public GenericDecleration[] extract(Class cl) {
// make an array of GenericDecleration from extracted classes
}
};
final DeclExtractor forMethods = new DeclExtractor() {
public GenericDecleration[] extract(Class cl) {
// make an array of GenericDecleration from extracted methods
}
};
}
이제 다음 getT
과 같이 "추출기"를 사용하도록 다시 작성할 수 있습니다 .
public static GenericDecleration[] getT (DeclExtractor extractor, Class cl) {
...
// When it's time to get components of the class, make this call:
GenericDecleration[] components = extractor.extract(cl);
...
}
에 전화를 걸려면 getT
, 전달 DeclExtractor.forClasses
또는 DeclExtractor.forMethods
:
GenericDecleration[] c = getT(DeclExtractor.forClasses);
GenericDecleration[] m = getT(DeclExtractor.forMethods);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다