Java中使用反射时遇到的问题

时间:2018-09-27 21:19:27

标签: java

这是我的主要课程:-

import io.*;
import processors.*;
import utilities.*;
import java.util.Scanner;
import java.io.IOException;


public class Main
{
    public static void main(String[] args)
    {

        AbstractCalcIO cio = null;
            //read properties file to know which type of operation needed.
            //then create appropriate class based on that.
        try {
            String opm = PropertyReader.getProperty("config.properties","opmode");

            System.out.println("Got input class name: "+opm);
                //get the class object from the name of the input class
            Class c = Class.forName(opm);
                //then cast it to AbstractCalcIO and then assign it to cio object
            Object obj = c.newInstance();

            cio = (AbstractCalcIO)obj;

            if(cio != null)
            {
                cio.startOperations();
            }   
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
}

在此项目中,我将Abstraction类,3-IO类用于输入控制,异常类等。在这里,我使用反射来避免代码重复。这也是控制功能的属性文件。但是在我使用反射的主类中,我会收到通知。因此,我的项目文件未编译。我认为Java版本会发生这种情况,我使用javac 10.0.2。那么,解决方案是什么?

在主类中,反射代码部分为:-

                Class c = Class.forName(opm);
                    //then cast it to AbstractCalcIO and then assign it to cio object
                Object obj = c.newInstance();

                cio = (AbstractCalcIO)obj;

属性文件是:-

datafile=E:\\java\\calcproject\\cdata.txt
opmode=io.CalcIOSingle
calcmode=sc

所以,最后我收到了此通知:-

E:\java\calcproject>javac Main.java
Note: Main.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

解决方案将用于此问题:- 对于Java版本10.0.2,将使用默认构造函数。

        Class<?> c = Class.forName(opm);
          //here need to use default constructor
        Constructor<?> cons = c.getDeclaredConstructor();
        Object obj = cons.newInstance();
        cio = (AbstractCalcIO)obj;

1 个答案:

答案 0 :(得分:0)

Class.newInstance方法绕过了对默认构造函数的调用,因此可能引发了异常(错误做法)。已经警告了这一点。 阅读javadoc。

因此,请使用默认的(无参数)构造函数:

Object obj = c.getConstructor().newInstance();