2011-08-14 4 views
11

Java에서 클래스에 대한 메서드가 있는지 확인하는 방법은 무엇입니까? try {...} catch {...} 성명을 잘 수행 할 수 있습니까?Java에서 런타임에 메소드가 존재하는지 확인하는 방법은 무엇입니까?

+0

리플렉션을 사용하고 있습니까? 그렇지 않으면, 당신이 무엇을 요구하고 있는지 잘 모르겠습니다 ... – Neil

+0

try/catch가 메소드 존재와 관련이 있습니까? 'remove '의 구현이'UnsupportedOperationException'을 던질 수있는'Iterator' 인터페이스와 같은 상황을 언급하지 않는다면? –

+1

기존 방법에 대해 어떤 종류의 검사를하고 있습니까? 반사? – Jaka

답변

21

난 당신이 방법 doSomething(String, Object)을 확인하려는 경우를 가정 해 보겠습니다.

이 작업을 시도 할 수 있습니다 : 메소드가 컴파일 시간에 해결 될 때문에이 작동하지 않습니다

boolean methodExists = false; 
try { 
    obj.doSomething("", null); 
    methodExists = true; 
} catch (NoSuchMethodError e) { 
    // ignore 
} 

.

정말 반사를 사용해야합니다. 호출하려는 메서드의 소스 코드에 액세스 할 수있는 경우 호출 할 메서드로 인터페이스를 만드는 것이 좋습니다.

[업데이트] 추가 정보는 다음과 같습니다. 이전 버전 (원하는 방법 없음)과 새 버전 (원하는 방법 사용)의 두 가지 버전으로 존재할 수있는 인터페이스가 있습니다. 그 바탕으로, 나는 다음과 같은 제안 : 방법 getAllowedNether 인터페이스에 존재하는지 여부를

package so7058621; 

import java.lang.reflect.Method; 

public class NetherHelper { 

    private static final Method getAllowedNether; 
    static { 
    Method m = null; 
    try { 
     m = World.class.getMethod("getAllowedNether"); 
    } catch (Exception e) { 
     // doesn't matter 
    } 
    getAllowedNether = m; 
    } 

    /* Call this method instead from your code. */ 
    public static boolean getAllowedNether(World world) { 
    if (getAllowedNether != null) { 
     try { 
     return ((Boolean) getAllowedNether.invoke(world)).booleanValue(); 
     } catch (Exception e) { 
     // doesn't matter 
     } 
    } 
    return false; 
    } 

    interface World { 
    //boolean getAllowedNether(); 
    } 

    public static void main(String[] args) { 
    System.out.println(getAllowedNether(new World() { 
     public boolean getAllowedNether() { 
     return true; 
     } 
    })); 
    } 
} 

이 코드 테스트, 그래서 실제 객체가 방법이 있는지 여부는 문제가되지 않습니다.

getAllowedNether 메서드를 매우 자주 호출해야하고 성능상의 문제가 발생하는 경우보다 진보 된 대답을 생각해 봐야합니다. 이건 지금은 괜찮을거야.

+0

이 메서드는 내 코드가 아니라 연결된 jar 파일입니다. – jrtc27

+0

어떤 방법인지 말할 수 있습니까? 이 메소드는'interface'에서 나온 것이므로'instanceof' 연산자로 그 존재를 간단히 질의 할 수 있습니까? –

+0

컴파일러가 지정한 jar를 통해 모든 메서드를 찾는다. 뭔가 찾지 못하면 오류 메시지가 표시된다 – Jaka

4

자바에서는 이것을 반사라고합니다. API를 사용하면 런타임에 메서드를 찾고 호출 할 수 있습니다. 다음은 문서에 대한 포인터입니다. 그것은 꽤 자세한 구문입니다하지만 해낼 수 있습니다 :

http://java.sun.com/developer/technicalArticles/ALT/Reflection/

+1

링크가 더 이상 작동하지 않습니다. – mikiqex

2
나는 방법이 존재하는지 확인하기 위해 예외를 처리하고 NULL 체크를하기 위해 별도의 방법을 사용하는 것이

예있다 obj, "getId", null)) 물건을하세요 ...

private Method getDeclaredMethod(Object obj, String name, Class<?>... parameterTypes) { 
    // TODO Auto-generated method stub 
    try { 
     return obj.getClass().getDeclaredMethod(name, parameterTypes); 
    } catch (NoSuchMethodException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 
} 
관련 문제