2016-12-25 79 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文件的接口。所有其他类现在都实现了这个接口。

相关问题