2011-02-04 3 views
2

자바 인터페이스를 으로 더 많이 사용하는 응용 프로그램을 자바 인터페이스보다으로 개발 중입니다. 즉, 런타임 중에 사용자가 인터페이스 클래스 내에서 사용 가능한 메서드를 나열 할 수 있어야합니다. 수 아무것도 :자바 인터페이스 반영 대안

private Class<? extends BaseInterface> interfaceClass. 

런타임에서, 내가 사용할 수있는 방법을 열거 형, 그리고 다음 사용자가 선택한 내용에 따라 일부 메소드를 호출 할 것이다.

내 질문은 : Java "인터페이스"아키텍처가 리플렉션 API를 사용하지 않고 메소드를 들여다보고 호출 할 수있는 방법을 제공합니까?

private Interface<? extends BaseInterface> interfaceAPI; 

public void someMethod(){ 
interfaceAPI.listMethods(); 
interfaceAPI.getAnnotations(); 
} 

어쩌면 내가 원하는 것을 달성하기 위해 유형 제네릭을 사용하는 몇 가지 방법이 : 내가 원하는

이 같은 (아마도 거기를) 있었다?

감사합니다,

파이드

+0

가 다른 방법이 있지만, 그들은 훨씬 더 IMHO입니다. 왜 당신은 반사를 사용하고 싶지 않다고 말하지 않았습니다. 아마도 귀하의 우려가 해결 될 수 있습니다. –

+0

당신은 즉석에서 코드를 생성 할 수 있습니다. (그리고 사용자 정의 클래스 로더를 통해로드 할 수 있습니다.)하지만 실제로는 반영됩니다. – bestsss

답변

5

정확히 리플렉션이 만들어진 것입니다.

1

내 질문은 : 나를 엿보고 반사 API를 사용하지 않고 메소드를 호출하는 자바 "인터페이스"아키텍처는 어떤 방법을 제공합니까?

A) 아니, 반사

b는) 전혀 그렇게하지 않는 것이 할 수있는 유일한 방법입니다. 동적 인 언어를 원하면 Groovy를 사용하십시오. 구문은 java와 거의 동일하지만이 기능의 대부분은 이미 내장되어 있습니다. (다른 많은 언어도 사용할 수 있지만 구문을 비교할 때 Groovy는 Java에 가장 근접합니다.)

+0

무엇이 잘못된 w/javascript입니까? 그것은 심지어 자바 자체에서 사용할 수 있습니까? – bestsss

+0

@bestsss JS에는 아무런 문제가 없습니다. 훌륭한 언어입니다. 하지만 추천을 할 때 어딘가에서 시작해야만합니다 –

+0

자바 스크립트에 대해 아무 말도하지 않았습니다. – bestsss

1

반사는 임의의 개체의 메서드를 나열하는 유일한 방법입니다. 음, 바이트 코드를 분석하는 것도 효과가 있지만 지루합니다.

+0

그건 거짓 진술입니다. 즉석에서 코드를 생성 할 수 있습니다. 프록시와 리플렉션은 코드를 뒤에서 처리합니다. 손으로 직접 할 수도 있습니다. – bestsss

+0

@bestsss'Object' 인스턴스가 주어 졌을 때, 어떻게 "손으로"그 메소드를 나열합니까? – Bozho

+0

@Bozho, 클래스 (Object.getClass()) 클래스 리소스'(ClassLoader.getResource (className.replace ('.', '\') + "클래스")'를 찾아 리소스를로드하고 구문 분석 상수 풀과 완료 ... 음, 라이브러리 (예 : bcel)가 있지만, 그 과정입니다 – bestsss

0

불행히도 반사가 유일한 방법이라고 생각합니다. 반성은 느리지 만 프로그래밍과 유지가 번거 롭기 때문에 불행합니다. 그래서 아파치 빈 util 라이브러리를 사용하는 것이 좋습니다. (구체적으로 methodutils)

1

Apache Commons BeanUtils을 살펴보십시오. 객체의 메소드와 속성을 프로그래밍 방식으로 확인하는 훌륭한 라이브러리입니다. 즉, (즉, 저수준 리플렉션 코드를 쓰지 않고)입니다. 여러 프로젝트에서 사용했습니다. 또한 일단 발견되면 해당 오브젝트 멤버에 액세스하기위한보다 쉬운 API를 제공합니다. PropertyUtilsMethodUtils은 좋은 출발점입니다.

0

여기에는 반성 할 방법이 없지만 주석을 사용하여 호출 가능한 메소드를 표시하면 상대적으로 고통스럽게 만들 수 있습니다. 이 접근 방식의 일례는 웹 서비스에 대한 javax.jws 주석 세트입니다. 아이디어는 실제로 유용 할 수 있습니다. 예를 들어 각 메소드/매개 변수의 표시 이름을 정의 할 수 있습니다. 주석과

0

반사 멋지게하고있다

for (Method m : interfaceClass.getMethods()) { 
     if (m.isAnnotationPresent(UIf.class)) { 
      UIf x = m.getAnnotation(UIf.class); 
      addDefinedCommand(new CommandDef(
        interfaceClass, 
        u, 
        x.name().isEmpty() ? m.getName() : x.name(), 
        x.description()) 
      ); 
     } 
}