Java 使用反射对字段调用方法

Java 使用反射对字段调用方法,java,reflection,queue,Java,Reflection,Queue,好吧,这件事做得太久了,没法进行。我有一个线程类型列表,可以是不同的类,即WriteFileData(扩展线程)。我想通过该列表进行for循环,并调用添加到队列中的字节数组。我现在有一个经纪人类 // consumers is filled with different Thread types all having a queue // variable of type LinkedBlockingQueue ArrayList<Thread> consumers = new Ar

好吧,这件事做得太久了,没法进行。我有一个线程类型列表,可以是不同的类,即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...
}
//消费者被不同的线程类型填充,所有线程类型都有一个队列
//LinkedBlockingQueue类型的变量
ArrayList使用者=新的ArrayList();
同步的无效插入(最终字节[]发送)引发InterruptedException{
用于(最终线程c:用户){
if(c WriteFileData实例){
((WriteFileData)c).queue.add(send);
} 
…其他类线程。。。
}
但我想做的是更符合

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....
synchronized void insert(最终字节[]send)引发中断异常{
用于(最终线程c:用户){
Class cls=Class.forName(c.getClass().getName());
Field Field=cls.getDeclaredField(“队列”);
Class cf=Class.forName(field.getType().getName());
类[]参数=新类[]{Object.Class};
方法meth=cf.getMethod(“提供”,参数);
meth.invoke(cf,send);//此行出错。。。。
编辑:修复了“找不到方法错误”,但现在似乎无法调用方法,因为我向它发送了一个数组,而它的方法只需要一个对象。

……唉,它在meth.invoke上出错了。由于这是多层次的,所以不确定如何执行,我想在队列上使用add方法,但这是类抽象的另一层

以下是WriteFileData的功能

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

...
}
公共类WriteFileData扩展线程{
LinkedBlockingQueue=新建LinkedBlockingQueue();
...
}

以下是我在@Erik的建议下所做的

下面是添加了add(byte[]send)方法的WriteFileData

公共类WriteFileData扩展线程{
私有LinkedBlockingQueue=新LinkedBlockingQueue();
公共无效添加(字节[]发送){
添加(发送);
}
...
}
现在我的代理类方法如下所示:

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);
公共同步无效插入(最终字节[]发送){
用于(最终线程c:用户){
试一试{
Class cls=Class.forName(c.getClass().getName());
方法meth=cls.getMethod(“add”,新类[]{byte[].Class});
方法调用(c,send);

offer方法的声明是什么?很抱歉用一个问题回答问题。但是为什么要使用反射?如果有替代使用反射的方法,你应该使用它。反射确实能够以你意想不到的方式破坏某些东西。你能包括异常和错误消息吗?我想让我们调试它我们需要知道哪里出了问题。请说出getDeclaredMethod()中的错误是。听起来你想让你的线程类实现一个Java接口,这样你就可以调用一个普通的方法。你有控制你的线程类的能力吗?错误是找不到方法…我想这样做的原因是代理类不需要知道线程类型的类或者导入线程类型的类。我可以调用它们一般地,将队列数据添加到它们中。这样,将来我就可以抽象这个层,而不必关心它调用什么线程类,只需通过列表中的内容就可以知道它。在我的世界中,最明显的事情就是创建一个带有offer()的接口方法,让所有线程实现该接口并对其进行迭代。我不理解您需要反射的原因,而且直接调用字段是一个很大的禁忌。如果我对此进行代码检查,您将立即失败。
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);