다른 개체에 대해 동일한 작업을 수행하는 방법

엔지니어 코딩

나는 현재 질문과 관련이없는 것을 처리 할 수있는 유틸리티 인 라이브러리를 만들고 있지만 (나는 그것이 정말로 중요하지 않기 때문에 암시 적으로 주제를 말하지 않는다), 그러나 그것은 반사를 사용한다.

클래스에서 선언되고 상속 된 모든 메서드를 검색하고 있는데, 현재 제대로 작동하고 문제가 아닙니다. 그러나 문제는 하위 클래스에 대해서도 동일한 메서드를 상속하므로이 작업을 수행해야합니다 (하지만 유사한 메서드를 재정의 할 수는 없음).

나는 그것이 동일한 알고리즘을 사용하는 대신 호출하는 차이가있을 것이라는 점을 직면하고 있다는 문제 clazz.getDeclaredMethods()내가 호출해야합니다 clazz.getMethods. 이것에도 접근하는 가장 좋은 방법은 무엇이며 메서드 서명에서도 Class [] 및 Method []를 반환해야합니다.

일반적으로 공유 된 수퍼 클래스를 찾지 만이 경우에는 Class []와 Method []를 그에 따라 선호합니다. 우선 몇 가지 조사를했고 공유 된 수퍼 클래스를 찾았습니다.

  • GenericDeclaration
  • AnnotatedElement

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

인라인 JavaScript를 통해 동일한 기능에 대해 다른 작업을 구현하는 방법

분류에서Dev

DevExpress XafCallback : ListEditor에서 5 개의 다른 버튼에 대한 프로세스 작업을 수행하는 방법

분류에서Dev

다운로드 한 파일의 일부에 대해 작업을 수행하는 방법

분류에서Dev

첫 번째는 사용자 정의 셀에서, 다른 하나는 스토리 보드에서 가져온 두 개의 버튼에 대해 동일한 작업을 수행하는 하나의 IBAction을 만드는 방법

분류에서Dev

다른 개체에 대해 동일한 개체를 전환하는 방법은 무엇입니까?

분류에서Dev

동일한 함수에 대해 다른 도메인을 그리는 방법

분류에서Dev

Reducer에서 여러 작업에 대해 동일한 상태 전환을 수행하는 방법

분류에서Dev

각 파일에 대해 다른 작업을 수행하는 For 루프

분류에서Dev

각 행에 대해 다른 그룹으로 Stata에서 작업을 수행하는 방법

분류에서Dev

exec로 찾기 : 각 파일에 대해 다단계 조건부 작업을 수행하는 방법

분류에서Dev

동일한 행에 대해 다른 조건을 확인하는 방법은 무엇입니까?

분류에서Dev

Python은 동일한 객체에 대해 동일한 작업을 두 번 수행하면서 두 가지 다른 결과를 제공합니다.

분류에서Dev

다른 이벤트에 대해 동일한 코드를 실행하는 방법

분류에서Dev

코드의 모든 부분에 대해 다른 작업을 수행하는 방법은 무엇입니까?

분류에서Dev

ListView의 모든 위치에 대해 다른 작업을 수행하는 방법은 무엇입니까?

분류에서Dev

다른 JTextField에 동일한 작업을 수행하는 작업 리스너를 추가하는 방법은 무엇입니까?

분류에서Dev

스트림을 사용하여 인덱스 범위가 아닌 요소에 대해 한 가지 작업을 수행하고 범위 내에서 다른 작업을 수행하는 방법은 무엇입니까?

분류에서Dev

Android에서 동일한 작업을 수행하기 위해 여러 버튼을 참조하는 방법

분류에서Dev

nodejs에서 동일한 양식을 통해 두 개의 다른 매개 변수를 전달하는 방법

분류에서Dev

두 개의 버튼 / 링크, 하나는 클릭 한 다음 다른 하나를 클릭 할 때까지 색상을 변경합니다. 다른 하나를 클릭하면 해당 항목에 대해 동일한 작업을 수행합니다.

분류에서Dev

다른 사용자에 대해 다른 시간에 실행되도록 작업을 예약하는 방법

분류에서Dev

동일한 열 내의 중복 값에 대해 IF 문을 수행하는 방법

분류에서Dev

동일한 조각을 다른 데이터로 대체하기 위해 백 스택을 처리하는 방법

분류에서Dev

모바일에서 동일한 섹션에 대해 다른 이미지 배경을 설정하는 방법

분류에서Dev

MYSQL의 단일 ID에 대해 동일한 열의 다른 레코드 값을 계산하는 방법

분류에서Dev

동일한 Firebase 프로젝트에서 개별 앱에 대해 서로 다른 클라우드 기능을 실행하는 방법은 무엇입니까?

분류에서Dev

다른 사전 키 / 값 일치에 대해 중첩 된 개체 사전을 쿼리하는 방법

분류에서Dev

동일한 작업을 수행하는 여러 버튼에 대해 onClick을 처리하는 방법은 무엇입니까?

분류에서Dev

요청에 대한 작업을 대기열에 넣고 동일한 작업을 한 번만 수행하는 방법

Related 관련 기사

  1. 1

    인라인 JavaScript를 통해 동일한 기능에 대해 다른 작업을 구현하는 방법

  2. 2

    DevExpress XafCallback : ListEditor에서 5 개의 다른 버튼에 대한 프로세스 작업을 수행하는 방법

  3. 3

    다운로드 한 파일의 일부에 대해 작업을 수행하는 방법

  4. 4

    첫 번째는 사용자 정의 셀에서, 다른 하나는 스토리 보드에서 가져온 두 개의 버튼에 대해 동일한 작업을 수행하는 하나의 IBAction을 만드는 방법

  5. 5

    다른 개체에 대해 동일한 개체를 전환하는 방법은 무엇입니까?

  6. 6

    동일한 함수에 대해 다른 도메인을 그리는 방법

  7. 7

    Reducer에서 여러 작업에 대해 동일한 상태 전환을 수행하는 방법

  8. 8

    각 파일에 대해 다른 작업을 수행하는 For 루프

  9. 9

    각 행에 대해 다른 그룹으로 Stata에서 작업을 수행하는 방법

  10. 10

    exec로 찾기 : 각 파일에 대해 다단계 조건부 작업을 수행하는 방법

  11. 11

    동일한 행에 대해 다른 조건을 확인하는 방법은 무엇입니까?

  12. 12

    Python은 동일한 객체에 대해 동일한 작업을 두 번 수행하면서 두 가지 다른 결과를 제공합니다.

  13. 13

    다른 이벤트에 대해 동일한 코드를 실행하는 방법

  14. 14

    코드의 모든 부분에 대해 다른 작업을 수행하는 방법은 무엇입니까?

  15. 15

    ListView의 모든 위치에 대해 다른 작업을 수행하는 방법은 무엇입니까?

  16. 16

    다른 JTextField에 동일한 작업을 수행하는 작업 리스너를 추가하는 방법은 무엇입니까?

  17. 17

    스트림을 사용하여 인덱스 범위가 아닌 요소에 대해 한 가지 작업을 수행하고 범위 내에서 다른 작업을 수행하는 방법은 무엇입니까?

  18. 18

    Android에서 동일한 작업을 수행하기 위해 여러 버튼을 참조하는 방법

  19. 19

    nodejs에서 동일한 양식을 통해 두 개의 다른 매개 변수를 전달하는 방법

  20. 20

    두 개의 버튼 / 링크, 하나는 클릭 한 다음 다른 하나를 클릭 할 때까지 색상을 변경합니다. 다른 하나를 클릭하면 해당 항목에 대해 동일한 작업을 수행합니다.

  21. 21

    다른 사용자에 대해 다른 시간에 실행되도록 작업을 예약하는 방법

  22. 22

    동일한 열 내의 중복 값에 대해 IF 문을 수행하는 방법

  23. 23

    동일한 조각을 다른 데이터로 대체하기 위해 백 스택을 처리하는 방법

  24. 24

    모바일에서 동일한 섹션에 대해 다른 이미지 배경을 설정하는 방법

  25. 25

    MYSQL의 단일 ID에 대해 동일한 열의 다른 레코드 값을 계산하는 방법

  26. 26

    동일한 Firebase 프로젝트에서 개별 앱에 대해 서로 다른 클라우드 기능을 실행하는 방법은 무엇입니까?

  27. 27

    다른 사전 키 / 값 일치에 대해 중첩 된 개체 사전을 쿼리하는 방법

  28. 28

    동일한 작업을 수행하는 여러 버튼에 대해 onClick을 처리하는 방법은 무엇입니까?

  29. 29

    요청에 대한 작업을 대기열에 넣고 동일한 작업을 한 번만 수행하는 방법

뜨겁다태그

보관