Thread.currentThread().getContextClassLoader().loadClass()和Class.forName()返回的Class对象会有啥区别没?还有关于反射的安全
还有以前比较老的初始化JDBC的代码里,那句
Class.forName(驱动类全名)
作用是什么啊
此外,反射里有个方法叫
setAccessible(boolean)
可以访问类的私有成员和方法,这样难道不会破坏安全性么??通过反射就可以访问私有成员了
Class.forName(驱动类全名)
作用是什么啊
此外,反射里有个方法叫
setAccessible(boolean)
可以访问类的私有成员和方法,这样难道不会破坏安全性么??通过反射就可以访问私有成员了
是new一个类的实例
比如Class.forName(A)就是new一个类A的实例
和A a = new A();作用一样反射里有个方法叫
setAccessible(boolean)
这里的访问是只读式的并不能修改
方法如果参数为true,则跳过访问检查,可以访问的private的域。也可以更改。是破坏了安全性,
但就是这样设计的,
可能是因为使用起来方便吧。
Class.forName(驱动类全名)
作用是什么啊 作用是把驱动程序的类加载到JVM中. 方便驱动管理程序来实例化驱动对象.(请注意,仅加载类模块)此外,反射里有个方法叫
setAccessible(boolean)
可以访问类的私有成员和方法,这样难道不会破坏安全性么??通过反射就可以访问私有成员了是的,已经破坏安全性了, 就象C里面的指针一样, 很危险,但很强大
A a = (A)Class.forName("pacage.A").newInstance();
这和你
A a = new A();
是一样的效果。 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段,动态加载和创建Class对象。
1、他是为了加载JDBC驱动架包的 ,为JDBC中实现其接口的, 他还可以加载别的驱动 .
2、("sun.jdbc.odbc.JdbcOdbcDriver"),用import的话,程序是不会去加载这个class的。只有通过Class.forNamesetAccessible(boolean)
能够动态的确定所需要的方法是否可用并调用他们。
这3个加载器分别对应着编译器去寻找类文件的优先级别和不同的路径:BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方
ExtClassLoader对应jre/lib/ext路径,是编译器次优先寻找class的地方
AppClassLoader对应当前路径,所以也是编译器默认找class的地方
现在给你分析你的问题我想因为Thread.currentThread().getContextClassLoader().loadClass(className)
是线程中的类加载器,直接调用起来效率最高,假设在这三个类加载器都找不到你的类,直接用Class.forname()映射
,这样就要多消耗资源了,一个线程调用资源开销不大,那要是几百个并发呢。个人理解楼主参考一下