2011-12-10 8 views
2

これはあまりにも長時間作業していて、うまく動作しません。私は異なるクラス、すなわちWriteFileData(スレッドを拡張することができる)のスレッドタイプのリストを持っています。私はそのリストを通してforループを行い、バイト配列をキューに追加するための呼び出しを行います。私は現在、ブローカークラスでReflectionを使用してフィールド上のメソッドを呼び出す

// 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.... 

EDITの線に沿ってもっと何かである:固定「方法が見つからないエラー」が、今はできません私はそれをArrayに送信しているのでメソッドを呼び出すように見え、そのメソッドはObjectだけを必要としています。

....メサ。インボークで悲しいです。多くのレベルで深刻なので、これを行う方法がわかりません。キュー上でaddメソッドを使いたいのですが、それはクラス抽象化のレイヤーです。

ここ

WriteFileDataが持っているものである...ここで

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

... 
} 
+0

'メソッド? – havexz

+0

質問にお答えして申し訳ありません。しかし、なぜ反射?反射を使用する代わりに使用する必要があります。反射はあなたが期待していない方法で本当にいくつかのものを壊すことができます。 例外とエラーメッセージを含めることができますか。私たちは何が間違っているか知る必要があるこれをデバッグすることを望みます。 –

+0

JPM、getDeclaredMethod()からのエラーを教えてください。あなたのスレッドクラスに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); 
関連する問題