繁体   English   中英

Java通用编程:确定类是否扩展了另一个

[英]Java Generic programming: Determining if class extends another

我需要在JTable中显示一些对象(终端,跑道,登机门,航空公司,工作人员等)。 我正在尝试构建一个适用于每个集合的GenericTableModel(与JTable一起使用)。 事情是其中一些对象具有数据结构,我不想显示这些结构。 因此,我通过从集合中获取第一个对象并要求获得其声明的字段来获取列名,这些对象不能从AbstractMap或Collection类分配。 这似乎对我有用,到目前为止,我仅获得所需的字段。 当我尝试向工人展示时,问题就开始了。 我有一个W_Worker抽象类,其中包含大多数用于worker的字段,并且我有不同的worker,例如W_Manager,W_FuelWorker等...每个子类只有1或2个字段,当我将它们放在一个使用我的GenericTableModel的表,我只从特定工作程序中获取字段,而没有从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);
 }

如您所见,我当前正在使用instanceof,但这还不够通用,因为它仅适用于W_Worker。

我会为此考虑一个访客模式 访客会知道如何处理TableModel。

有点像这样:

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);

您可能正在使用Class.getDeclaredFields方法。 您需要Class.getFields。 此处提供更多信息: http : //forgetfulprogrammer.wordpress.com/2011/06/13/java-reflection-class-getfields-and-class-getdeclaredfields/

对于任何类,您都可以使用Reflection查看它的扩展和/或实现。 然后,对您拥有的不同工作者类的类型进行比较,并调用您认为合适的方法。 下面是一个完整的示例: http : //docs.oracle.com/javase/tutorial/reflect/class/classModifiers.html

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

感谢您的答复和时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM