2011-12-10 2 views
2

오랫동안이 작업을 해왔으므로 제대로 작동하지 않습니다. 다른 클래스, 즉 WriteFileData (스레드 확장) 일 수있는 스레드 유형 목록이 있습니다. 그 목록을 통해 for 루프를 수행하고 바이트 배열을 대기열에 추가하라는 호출을하고 싶습니다. 나는 현재 브로커 클래스에서 이것을 가지고리플렉션을 사용하여 필드에서 메소드 호출

// consumers is filled with different Thread types all having a queue 
// variable of type LinkedBlockingQueue 
ArrayList<Thread> consumers = new ArrayList<Thread>(); 

synchronized void insert(final byte[] send) throws InterruptedException { 
    for (final Thread c : consumers) { 
     if (c instanceof WriteFileData) { 
      ((WriteFileData)c).queue.add(send); 
     } 
     ...other class threads... 
} 

하지만 내가 원하는 것은

synchronized void insert(final byte[] send) throws InterruptedException { 
    for (final Thread c : consumers) { 
     Class<?> cls = Class.forName(c.getClass().getName()); 
     Field field = cls.getDeclaredField("queue"); 
     Class<?> cf = Class.forName(field.getType().getName()); 
     Class[] params = new Class[]{Object.class}; 

     Method meth = cf.getMethod("offer", params); 

     meth.invoke(cf, send); // errors at this line.... 

편집의 라인을 따라 뭔가 더있다 : 이제 "오류를 찾을 수없는 방법"고정하지만 할 수 없습니다 메소드를 호출하는 것처럼 보입니다. 배열로 보내고 메소드는 그냥 Object를 원합니다.

.... 아, 그것은 meth.invoke에서 오류입니다. 이 작업을 수행하는 방법을 여러 단계 깊숙히 알지 못했기 때문에 큐에 add 메서드를 사용하고 싶었지만 클래스 추상화 계층이 하나 더 필요합니다.

다음

WriteFileData이 무슨입니다 ... 여기

public class WriteFileData extends Thread { 
    LinkedBlockingQueue<byte[]> queue = new LinkedBlockingQueue<byte[]>(); 

... 
} 
+0

'방법? – havexz

+0

질문에 대한 답변에 죄송합니다. 하지만 왜 반사? 리플렉션 사용에 대한 대안이있는 경우이를 사용해야합니다. 반사는 당신이 예상하지 못한 방식으로 어떤 것들을 정말로 깨뜨릴 수 있습니다. 예외 및 오류 메시지를 포함시킬 수 있습니까? 나는 우리가 무엇을 잘못했는지 알 필요가있는 이것을 디버그하기를 원한다. –

+0

JPM, getDeclaredMethod()의 오류가 무엇인지 말씀해주십시오. 당신이 일반적인 메소드를 호출 할 수 있도록 Thread 클래스가 Java 인터페이스를 구현하도록하려는 것 같습니다. 스레드가되는 클래스를 제어 할 수 있습니까? –

답변

1

내가 @Erik에서 조언했던 것입니다. 여기

는 (바이트 [] 전송) 추가 방법 추가로

public class WriteFileData extends Thread { 
    private LinkedBlockingQueue<byte[]> queue = new LinkedBlockingQueue<byte[]>(); 

    public void add(byte[] send) { 
     queue.add(send); 
    } 

... 
} 

WriteFileData입니다 그리고 지금 내 브로커 클래스 메소드는 다음과 같습니다 선언이`제공을 위해 무엇

public synchronized void insert(final byte[] send) { 
    for (final Thread c : consumers) { 
    try { 
     Class<?> cls = Class.forName(c.getClass().getName()); 
     Method meth = cls.getMethod("add", new Class[]{byte[].class}); 
     meth.invoke(c, send); 
관련 문제