오랫동안이 작업을 해왔으므로 제대로 작동하지 않습니다. 다른 클래스, 즉 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[]>();
...
}
'방법? – havexz
질문에 대한 답변에 죄송합니다. 하지만 왜 반사? 리플렉션 사용에 대한 대안이있는 경우이를 사용해야합니다. 반사는 당신이 예상하지 못한 방식으로 어떤 것들을 정말로 깨뜨릴 수 있습니다. 예외 및 오류 메시지를 포함시킬 수 있습니까? 나는 우리가 무엇을 잘못했는지 알 필요가있는 이것을 디버그하기를 원한다. –
JPM, getDeclaredMethod()의 오류가 무엇인지 말씀해주십시오. 당신이 일반적인 메소드를 호출 할 수 있도록 Thread 클래스가 Java 인터페이스를 구현하도록하려는 것 같습니다. 스레드가되는 클래스를 제어 할 수 있습니까? –