如何在运行时在java中创建新添加的类的实例

时间:2016-12-25 08:19:00

标签: java spring

我必须编写一个不同的类来读取不同类型的文件。现在项目部署在客户端。我们必须支持新文件。所以我们必须创建一个新类,并在服务类中修改以创建新添加的类的新对象。为新类型编写新类很好。但我不想每次都改变服务类。这种问题有什么解决方案吗?提前致谢。

更新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

3 个答案:

答案 0 :(得分:1)

可以在运行时使用java中的反射创建实例,请看下面的帖子:

Creating an instance using the class name and calling constructor

答案 1 :(得分: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()函数。

答案 2 :(得分:0)

最后做了一些代码更改并添加了属性文件,用于映射具有file属性的类名,这是代码并且工作正常。

foreach (DataGridViewRow row in b1.DataGridView1.SelectedRows)
{
   string value = row.Cells[4].Value.ToString();
   double currentCellValue = 0.0;  
   if(double.TryParse(value , out currentCellValue)
   { 
      totalCost += currentCellValue;
   }
 }
TotalCost.Text = totalCost .ToString();

现在它工作正常。但是为此我创建了一个用于读取具有readTxtFile方法的txt文件的接口。现在所有其他类都实现了这个接口。