import是给编译器用的,
class.forName是运行时生效的,
谢答!
我知道的是 Class.forName(A)这个方法会将类A加载到内存当中,而类A一旦被加载到内存中时,就会执行类A中的静态代码块。所以我想的是,利用import A;应该也能将类A加载到内存中,从而实现同样的效果。可是貌似编译时,会删除无用的导入类,即使我加入了@SuppressWarnings("unused")也会删除。。。。。。
@爱前端的后端Coder:
不行的,即使不删除也没用,import只在编译的时候用,给你举个例子:
有两个类A,B, 在B中import了A,
B:
import org.test.A
.....
public static void main(String[] args){
A a = new A();
}
那么B在编译之后变成了:
public static void main(String[] args){
org.test.A a = new org.test.A();
}
这就是import的作用,编译之后再无作用,
与类加载没有任何关系
你这个有点鸡蛋里挑骨头的样子 照着写不就好了嘛!
这个问题问的很尖锐
很好的问题,为此我特地实验了一下,直接import Driver, 然后DriverManager.registerDriver(Driver());是可行的的,事实上,看com.mysql.jdbc.Driver源码发现其内部就是执行了如下静态代码块:
static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
为啥jdk作者或者是mysql驱动开发者不直接让开发人员new,而是通过类全称来加载Driver类,我能想到的一点原因是 根据字符串来加载类可以做到java代码与具体数据库解耦分离,通常我们会将驱动类的全称写进配置文件,需要切换数据库时,只需修改配置文件即可,而java代码几乎可以不用做任何修改;而使用new加载创建Driver实例就不行了。
再补充一点,直接import com.mysql.jdbc.Driver;不写DriverManager.registerDriver(new Driver());也是可行的!缺点还是如上。
@学数学的程序猿: 谢答!直接import com.mysql.jdbc.Driver;这样是不行的,我反编译后,发现因为导入的这个Driver类,因为并没用用到,所以,编译器编译时会直接删除这句导包的语句:import com.mysql.jdbc.Driver;
我知道的是 Class.forName(A)这个方法会将类A加载到内存当中,而类A一旦被加载到内存中时,就会执行类A中的静态代码块。所以我想的是,利用import A;应该也能将类A加载到内存中,从而实现同样的效果。可是貌似编译时,会删除无用的导入类,即使我加入了@SuppressWarnings("unused")也会删除。。。。。。
@爱前端的后端Coder: 我昨晚试的是可以的。之前也想到编译器可能会做优化,删除"无用"的语句,但事实上它没有,我用的是java8,不知你用的是啥版本?
@学数学的程序猿: 我用的也是java8、myeclipse、真的是反复清理、刷新了好几次,确认编译后的文件的确删除了那条导入语句。。。。。
@爱前端的后端Coder: 确实被删除了,但我发现啥都不写直接DriverManager.getConnection(...)居然也成功获取到数据了,有图为证:
@学数学的程序猿: 应该报的是 找不到驱动的错误,不清楚你的什么情况 -_-
这是一个很简单的语法知识,Class.forName#String 是执行Class类的静态方法,你这里的“com.mysql.jdbc.driver”是参数而已,在java文件中,使用类需要写类全名(如直接写com.mysql.jdbc.Driver),或者写简名Driver,前提是在在前面写import 包名,Class类属于java.lang包,默认包含java.lang
谢答!
我知道的是 Class.forName(A)这个方法会将类A加载到内存当中,而类A一旦被加载到内存中时,就会执行类A中的静态代码块。所以我想的是,利用import A;应该也能将类A加载到内存中,从而实现同样的效果。可是貌似编译时,会删除无用的导入类,即使我加入了@SuppressWarnings("unused")也会删除。。。。。。
@爱前端的后端Coder:
我觉得已经说得够清楚了,import只是语法,最终看生成class文件,如果你了解更多的话应该去看class文件结构.Class#forName 查看官方文档http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#forName-java.lang.String-