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

来源:2-1 Java 动态加载类

weixin_慕村3424678

2020-06-24 15:03

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


写回答 关注

2回答

  • 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

反射——Java高级开发必须懂的

反射,Java高级开发必须要懂的知识点,学好Java高级课程的基础

151465 学习 · 335 问题

查看课程

相似问题