Использование Reflection для вызова метода в поле - PullRequest
2 голосов
/ 10 декабря 2011

Хорошо, работаю над этим слишком долго и не могу заставить его работать.У меня есть список типов потоков, которые могут быть разных классов, т.е. WriteFileData (расширяет поток).Я хочу за цикл по этому списку и сделать вызов, чтобы добавить в очередь массив байтов.В настоящее время у меня есть это в классе брокера

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

РЕДАКТИРОВАТЬ: Исправлено "метод не найден ошибка"но теперь я не могу вызвать метод из-за того, что я посылаю ему массив, а его метод хочет только объект.

.... увы, он вызывает ошибку при meth.invoke.Не уверен, как это сделать, так как это многоуровневый уровень, я хотел использовать метод add в очереди, но это еще один уровень абстракции класса.

Вот что имеет WriteFileData ...

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

...
}

1 Ответ

1 голос
/ 13 декабря 2011

Вот то, что я сделал с некоторыми советами @ Erik.

Вот WriteFileData с добавленным методом add (byte [] send) ...

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

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

...
}

А теперь мой брокерМетод класса выглядит следующим образом:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...