2016-12-25 40 views
0

我必須編寫不同的類來讀取不同類型的文件。現在項目部署在客戶端。我們必須支持新的文件。所以我們必須創建一個新類並在服務類中修改以創建一個新添加的類的新對象。爲新類型編寫一個新類是很好的。但我不想每次都更換服務類。有這種問題的解決方案嗎?提前致謝。如何在運行時在java中創建新添加的類的實例

更新1:這裏是服務類的代碼

@Service("StockistServiceImpl") 
public class StockistServiceImpl implements StockistService { 

@Override 
@Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class) 
public JSONArray saveStockistOrder(Integer stockistId, 
     MultipartFile[] orderFile, String orderNumber, String orderDate, 
     String partyCode,String order,Integer userId) 
{ 
          List<Pair<String, Integer>> charList = new ArrayList<Pair<String, Integer>>(); 
          Properties code1 = new Properties(); 
          try { 
           code.load(StockistServiceImpl.class.getClassLoader().getResourceAsStream("categoryOfFile.properties")); 
          } 
          catch (IOException e) { 
           //System.out.println("error in loading divisionNamePdfCode.properties"); 
           e.printStackTrace(); 
          } 
          String readDuelListedTxtFile = code.getProperty("readDuelListedTxtFile"); 
          String readStartLineLengthForOrderTxtFile = code.getProperty("readStartLineLengthForOrderTxtFile"); 
          String ReadFileWithNoStartLineTxtFile = code.getProperty("ReadFileWithNoStartLineTxtFile"); 
          String ReadStartLineLengthForQtySingleListTxtFile = code.getProperty("ReadStartLineLengthForQtySingleListTxtFile"); 

          if (readDuelListedTxtFile.contains(partyCode 
            .trim())) { 
           charList.addAll(dualListText 
              .readDuelListedTxtFile(
                fileName, codeDetails)); 
          } 
          else if (readStartLineLengthForOrderTxtFile.contains(partyCode 
            .trim())) { 
           charList.addAll(lineLength 
              .readStartLineLengthForOrderTxtFile(
                fileName, codeDetails)); 
          } 
          else if (ReadFileWithNoStartLineTxtFile.contains(partyCode 
            .trim())) { 
           T_FileWithNoStartLine noStartLine = new T_FileWithNoStartLine(); 
           charList.addAll(noStartLine 
              .readFileWithNoStartLineTxtFile(
                fileName, codeDetails)); 
          } 
          else if (ReadStartLineLengthForQtySingleListTxtFile.contains(partyCode 
            .trim())) { 
           T_StartLineLengthForQtySingleList noStartLine = new T_StartLineLengthForQtySingleList(); 
           charList.addAll(noStartLine 
              .readStartLineLengthForQtySingleListTxtFile(
                fileName, codeDetails)); 
          } 
} 

更新2:這裏是屬性文件的地方,我們知道什麼是一個配貨文件類型。

#fileType,stockistCode 
fileType1=ST001,ST009 
fileType2=ST002,ST005,ST006 
fileType3=ST003,ST007 
fileType4=ST004,ST008 

,我想添加一個新的屬性文件這樣的映射與類名的文件類型,所以如果一個新的類添加,然後我們就不必編輯服務類。

#fileType,fullyqualifiedclassName 
fileType1=FullyQualifiedClassName1 
fileType2=FullyQualifiedclassName2 
fileType3=FullyQualifiedClassName3 
fileType4=FullyQualifiedclassName4 
+1

你可以添加一些代碼並解釋你的問題嗎? – developer

+0

查看[ServiceLoader](http://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html)類。 – Seelenvirtuose

回答

1

單獨創建文件的讀者對象和服務類。

public class BuildFileReader() { 
    FileReader getReader(String xyz) { 
     FileReader reader; 

     ... 
     your logic 
     reader = new WhatEverReaderYouWant(); 
     ... 

     return reader; 
    } 
} 

服務類只是詢問BuildFileReader要使用哪個FileReader並且不需要再改變。

public class StockistServiceImpl { 
    ... 
    BuildFileReader bfr = new BuildFileReader(); 

    FileReader fileReader = bfr.getReader(xyz); 

    fileReader.readFile(fileName, codeDetails); 
    ... 
} 

如果每個客戶端只需要一種類型的文件讀取器,則可以爲每個客戶端配置您的BuildFileReader。 如果您需要每個客戶端不止一種類型的文件讀取器,請爲每種類型定義一個接口,併爲BuildFileReader中的每個所需類型添加getReaderXYZ()函數。

0

最後,在做了一些代碼更改並添加屬性文件來映射具有文件屬性的類名稱時,代碼並且工作正常。

@Service("StockistServiceImpl") 
public class StockistServiceImpl implements StockistService { 

List<Pair<String, Integer>> charList = new ArrayList<Pair<String, Integer>>(); 


Map<String,String> mapTxtFile = new HashMap<String, String>(); 
          Properties fileTypeProperties = new Properties(); 
          Properties matchClassNameProperties = new Properties(); 
          try { 
           fileTypeProperties.load(StockistServiceImpl.class.getClassLoader().getResourceAsStream("fileTypeProperties.properties")); 
          } 
          catch (IOException e) { 

           //e.printStackTrace(); 
          } 
          try { 
           matchClassNameProperties.load(StockistServiceImpl.class.getClassLoader().getResourceAsStream("matchClassNameProperties.properties")); 
          } 
          catch (IOException e) { 

           //e.printStackTrace(); 
          } 

          for (String key : fileTypeProperties.stringPropertyNames()) { 
           String value = fileTypeProperties.getProperty(key); 
           mapTxtFile.put(key, value); 

           if(value.contains(partyCode.trim())){          
            String className = matchClassNameProperties.getProperty(key); 
            try { 
             Class clazz = Class.forName(className); 
             try { 
              TxtFile objToReadTxtFile = (TxtFile) clazz.newInstance(); 
              charList= objToReadTxtFile.readTxtFile(fileName, codeDetails); 

             } catch (InstantiationException e) { 
              // TODO Auto-generated catch block 
              e.printStackTrace(); 
             } catch (IllegalAccessException e) { 
              // TODO Auto-generated catch block 
              e.printStackTrace(); 
             } 

            } catch (ClassNotFoundException e) { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
            } 
           }else{ 
            //read normally else block 

           } 
          } 


} 

現在它工作正常。但爲此,我創建了一個讀取具有readTxtFile方法的txt文件的接口。所有其他類現在都實現了這個接口。

相關問題