Java泛型编程:确定类是否扩展另一个类

Java泛型编程:确定类是否扩展另一个类,java,swing,generics,reflection,Java,Swing,Generics,Reflection,我需要在JTable中显示一些对象(航站楼、跑道、登机口、航空公司、工人等)。 我正在尝试构建一个GenericTable模型(用于JTable),它将适用于每个集合。 问题是其中一些对象有数据结构,我不想展示这些结构。 因此,我通过从集合中获取第一个对象并请求其声明的字段来获取列名,这些字段不能从AbstractMap或集合类中赋值。 这似乎对我有用,到目前为止,我只得到了我需要的领域。 当我试图向工人们展示时,问题就开始了。我有一个W_Worker抽象类,其中包含工人的大部分字段,我有不同的

我需要在JTable中显示一些对象(航站楼、跑道、登机口、航空公司、工人等)。 我正在尝试构建一个GenericTable模型(用于JTable),它将适用于每个集合。 问题是其中一些对象有数据结构,我不想展示这些结构。 因此,我通过从集合中获取第一个对象并请求其声明的字段来获取列名,这些字段不能从AbstractMap或集合类中赋值。 这似乎对我有用,到目前为止,我只得到了我需要的领域。 当我试图向工人们展示时,问题就开始了。我有一个W_Worker抽象类,其中包含工人的大部分字段,我有不同的工人,如W_Manager、W_FuelWorker等。。。 每个子类只有1或2个字段,当我使用我的GenericTableModel将它们放在表中时,我只从特定的worker获取字段,而不从W_worker获取字段

我如何在方法开始时确定该类是否扩展了另一个类并使其首先获取这些字段

如果这不足以理解,我将提供代码。 提前感谢,, 塔尔

编辑:添加代码。

public String[] getColumnName(Collection<T> collection){
     Field fields[] = null;
     String fieldsNames[];
     ArrayList<String> desiredFields = new ArrayList<>();

     for(Object o : collection){
        fields = o.getClass().getDeclaredFields();
        if (o instanceof W_Worker){
            Field[] superFields = o.getClass().getSuperclass().getDeclaredFields();
            Field[] result = new Field[superFields.length + fields.length];
            System.arraycopy(superFields, 0, result, 0, superFields.length);
            System.arraycopy(fields, 0, result, superFields.length, fields.length);
            fields = result;
        }
        break;
     }
     fieldsNames = new String[fields.length];
     for(int i = 0; i<fields.length ;i++){
         if (!Collection.class.isAssignableFrom(fields[i].getType()) && !AbstractMap.class.isAssignableFrom(fields[i].getType())){
            fieldsNames[i] = fields[i].getName();
         }
     }
     for(String field : fieldsNames){
         if (field != null){
             desiredFields.add(field);
         }
     }
     String newFields[] = new String[desiredFields.size()];
     return desiredFields.toArray(newFields);
 }
公共字符串[]getColumnName(集合){
字段[]=null;
字符串字段名称[];
ArrayList desiredFields=新的ArrayList();
用于(对象o:集合){
fields=o.getClass().getDeclaredFields();
if(W_Worker的o实例){
字段[]超字段=o.getClass().getSuperclass().getDeclaredFields();
字段[]结果=新字段[superfelds.length+字段.length];
System.arraycopy(超场,0,结果,0,超场,长度);
System.arraycopy(字段,0,结果,超字段长度,字段长度);
字段=结果;
}
打破
}
fieldsNames=新字符串[fields.length];

对于(int i=0;i您可能正在使用Class.getDeclaredFields方法。您需要Class.getFields。此处的详细信息:

对于任何类,您都可以通过使用反射来查看它扩展和/或实现了什么。之后,对您拥有的不同工作类的类型进行比较,并调用您认为合适的方法。一个完全有效的示例le正在追踪: 我想考虑一下这个问题。客人会知道如何处理表格。

有点像这样:

public class TableModelVisitor {

   private TableModel model;

   public void visit(Terminal terminal) {
      terminal.accept(this);
   }
   public void visit(Runway runway) {
      runway.accept(this);
   }
   public void visit(Worker worker) {
      worker.accept(this);
   }

   //your methods to treat the model
}
然后,您可以让每个节点处理访问者,并要求其执行填充模型之类的操作:

public class Worker {
   public void accept(TableModelVisitor tableModelVisitor) {
      //and here you know everything about your worker and its fields
      //and have access to your visitor table model to configure it.
      tableModelVistor.addField(this.getMyField1());
      tableModelVistor.addField(this.getMyField2());
   }
}
最后,您所要做的就是创建一个TableModelVisitor,并要求它填充您想要的任何模型

TableModelVisitor visitor = new TableModelVisitor(myTableModel);
visitor.visit(anyOfMyObjects);

谢谢大家,我最终更改了GenericTableModel以接收一个集合和一个字符串数组,其中包括我想要的对象字段。 这样我保持了它的通用性,并为我的项目获得了最好的结果


感谢您的回复和时间。

有些代码对您很有帮助。关于某些代码的纯文本问题永远不够。请发布相关代码。您的所有类是否都扩展了一个公共类?否则,如果您从一个节点类开始,您如何知道何时到达层次结构的根?如果它们不属于公共类ncestor我认为你不能像以前那样阻止对类名进行硬编码。我想有一种方法可以避免你阅读这些集合,那就是用你设计的一些注释对你的类进行注释,然后使用一个库来轻松定位注释字段。字段中的注释和字段本身可能会继续n您需要的所有元数据。谢谢,但我被要求创建一个通用表模型,该模型适用于所有集合,并且您的方法(如果我理解正确的话)只适用于类。我将创建一个visit方法。