2016-08-16 3 views
1

우리는 동적 클래스 로더 프로젝트에서 작업 중이며 URLClassLoader를 통해 동적으로로드 된 클래스에서 메소드를 호출하려고합니다. 이클립스에서 실행될 때 꽤 잘 작동하기 때문에 호출하는 클래스와 동적으로로드되는 클래스는 두 개의 다른 jar에 번들되고 두 개의 jar로 분할되어야하기 때문에 서버에 배치된다.자바 리플렉션에 의해 메소드를 호출 할 수 없습니다 : NoSuchMethodException

NoSuchMethodException 반사 API를 사용하여 mapClass.getDeclaredMethod("run", oneParam)을 호출 할 때 예외가 발생합니다.

우리는 Jar를 확인했으며 호출되는 메소드가 클래스에 있음을 확인합니다. 여기

import com.altova.io.Input; 
import com.altova.io.FileInput; 

Input sourceInput = new FileInput(inputFileFullPath); 

Class oneParam[] = { Input.class }; 
Object mapObj = mapClass.newInstance(); 
Method method = mapClass.getDeclaredMethod(RUN, oneParam); 
li = (List) method.invoke(mapObj, sourceInput); 

예외 (파라미터)에서 I는 (메소드 서명)에서 입력 및 fileinput 함수 의심

java.lang.NoSuchMethodException:  
    com.sample.test.TrackingService.run(com.altova.io.Input) 

유일한 차이점이다 .. 샘플 코드이다.

Eclipse에서는 제대로 작동하지만 서버에서는 제대로 작동하지 않습니다. JDK 1.6 & 1.7 테스트하지만, 서버는 JDK 1.7

두 번째 옵션을 실행 .. 시도 아래와 같이하지만,이 시간이

java.lang.IllegalArgumentException가 발생 것 : 인수 형식이 일치하지

을 코드

for (Method method : mapClass.getDeclaredMethods()) { 
method.setAccessible(true); 
if (method.getName().equals("run")) { 
    Class<?>[] params = method.getParameterTypes(); 
    if (params.length == 2) { 
     if (params[0].isInstance(sourceInput) && params[1].isInstance(outputStream)) { 
      li = (List<ByteArrayOutputStream>) method.invoke(mapObj, sourceInput, outputStream); 
      System.out.println(" Parsing is complete:"); 
     } 
    } 
}} 
+0

@Dirk Lachowski가 게시물을 명확하고 합리적인 것으로 편집 해 주셔서 감사합니다. – Ramesh

답변

0

그것은했다. 내가 말했듯이 이클립스 실행할 때 같은

URLClassLoader loader = new URLClassLoader(new URL[] { new URL("file:/opt/jars/Tracking.jar") }, this.getClass().getClassLoader());

나머지의 모든 ...와 아웃 현재의 클래스 로더를 추가도했다.

1

비공개 메소드를 호출하는 것으로 보입니다. 당신이 필요로 그것을 accessible를 만드는 것입니다 : 아래 그림과 같이 클래스 로더를 변경하는 경우

Method method = mapClass.getDeclaredMethod(RUN, oneParam); 
method.setAccessible(true); 
+0

의견을 보내 주셔서 감사합니다 vsminkov. 게시물을 편집했습니다. 오류는 getDeclaredMethod()를 호출하는 중입니다. – Ramesh

+0

당신이 제안한대로 시도했지만 .. 이번에는 java.lang.IllegalArgumentException을 던졌습니다 : 인수 유형 불일치, 어떤 제안? – Ramesh

+0

@Ramesh는'mapClass'에 둘 이상의'run' 메쏘드가있을 가능성이 있습니까? 편집시 단일 인수'run (com.altova.io.Input) '만 보여 주면서 두 개의 매개 변수를 사용하여'run'을 호출하려고합니다. – vsminkov

관련 문제