在java中使用反射面临的问题

在java中使用反射面临的问题,java,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 propert

这是我的主课:-

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);
        }
    }
}
在这个项目中,我使用抽象类、用于输入控制的3-IO类、异常类等等。这里我使用反射来避免代码重复。这里还有一个控制功能的属性文件。但是在我使用反射的主类中,我会收到一个通知。由于这个原因,我的项目文件没有被编译。我认为java版本会出现这种情况,我使用JavaC10.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;
Class c=Class.forName(opm);
//这里需要使用默认构造函数
构造函数cons=c.getDeclaredConstructor();
Object obj=cons.newInstance();
cio=(抽象计算)obj;
该方法绕过对默认构造函数的调用,因此可能引发异常(错误做法)。这已经被警告了很久了。 阅读javadoc

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

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

没有提供足够的信息来回答这个问题。请包含build.gradle或pom.xml以及项目的某些上下文。(另外,我建议升级到openjdk 11,因为它是LTS版本)这说明了原因:请阅读它。它说:使用-Xlint:deprecation重新编译以获取详细信息。。所以,这样做,并阅读详细的消息,你会得到。我尝试现在你的评论。但是先生,它仍然不起作用。。。我更改的代码部分是:-Class c=Class.forName(opm);Object obj=c.getDeclaredConstructor().newInstance();和
getConstructor()
?我希望有一个没有参数的(默认)构造函数。顺便说一句,使用接口可以更快地完成类似的事情,因为反射成本高,速度慢。很抱歉,getConstructor适用于公共构造函数,这是最好的方法,因为调用私有或受保护的构造函数是危险的。getDeclaredConstructor需要
setAccessible(true)