问答详情
源自:2-1 Java 动态加载类

把Class.forName()换一种写法就报错了!

1 首先,这段代码没有任何问题。
public class OfficeBetter{
      public static void main(String[] args){
      try{
        OfficeAble oa =(OfficeAble) Class.forName(args[0]).getConstructor().newInstance();
        oa.start();
      }catch(Exception e){
e.printStackTrace();
      }
  }
}

2 可是,当我不想用

Class.forName(args[0])

来获取类类型,改成这种写法就报错了:

public class OfficeBetter{
      public static void main(String[] args){
      try{
        Class c=Class.forName(args[0]);
        Constructor constructor=c.getConstructor();
        OfficeAble oa=(OfficeAble)constructor.newInstance();
        oa.start();
      }catch(Exception e){
e.printStackTrace();
      }
  }
}

谁能帮我分析一下吗?编译报错:

OfficeBetter.java:5: error: cannot find symbol
        Constructor constructor=c.getConstructor();
        ^
  symbol:   class Constructor
  location: class OfficeBetter
Note:
OfficeBetter.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error


提问者:weixin_慕村3424678 2020-06-24 15:03

个回答

  • qq_学着遗忘_0
    2020-07-13 10:28:18
    已采纳

     本来代码里面是动态类实现,你Constructor constructor=c.getConstructor();这行代码使用了静态类的实现方式,应该会编译不过,因为c.getConstructor()无法在静态编译期间确定类型。

  • weixin_慕村3424678
    2020-07-13 15:56:00

    正解。多谢你的解答,后面我看书之后,了解了Class.forName("xxx")是动态编译。当时不懂。下面是我的笔记,

    http://img2.mukewang.com/5f0c138200010f6316931079.jpg