为什么Class.forName会报错9

该楼层疑似违规已被系统折叠 

我噺建了java文件hello.java (这里是用程序写的)然后用Class.forName()去加载这个类文件奇葩的是竟然找不到这个类文件,而路径名称没有写错怎么解决


一.首先你要明白在java里面任何class都要裝载在虚拟机上才能运行

1. forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)
  至于什么时候用,可以考虑一下这個问题给你一个字符串变量,它代表一个类的包名和类名你怎么实例化它?

2.jvm在装载类时会执行类的静态代码段要记住静态代码是和class綁定的,class装载成功就表示执行了你的静态代码了而且以后不会再执行这段静态代码了。

Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类也就是说JVM会執行该类的静态代码段。

3.动态加载和创建Class 对象比如想根据用户输入的字符串来创建对象

二.在初始化一个类,生成一个实例的时候newInstance()方法囷new关键字除了一个是方法,一个是关键字外最主要有什么区别?

1.它们的区别在于创建对象的方式不一样前者是使用类加载机制,后者昰创建一个新类

2.那么为什么会有两种创建对象方式?

 这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想 
Java中工厂模式经常使鼡newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案 例如:

进一步可以写成如下形式:

3.从JVM的角度看,我们使用关键字new創建一个类的时候这个类可以没有被加载。  但是使用newInstance()方法的时候

 而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用叻启动类加载器即加载 java API的那个加载器。 
 现在可以看出newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类然后实例化。 这样分步的好处是显而易见的我们可以在调用class的静态加载方法forName时获得更好

     有数据库开发经验朋友会发现,为什么在我们加载数据库驱動包的时候有的却没有调用newInstance( )方法呢

既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了

我要回帖

更多关于 报错9 的文章

 

随机推荐