簡體   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