还有以前比较老的初始化JDBC的代码里,那句
Class.forName(驱动类全名)
作用是什么啊
此外,反射里有个方法叫
setAccessible(boolean)
可以访问类的私有成员和方法,这样难道不会破坏安全性么??通过反射就可以访问私有成员了

解决方案 »

  1.   

    Class.forName(驱动类全名)
    是new一个类的实例
    比如Class.forName(A)就是new一个类A的实例
    和A a = new A();作用一样反射里有个方法叫 
    setAccessible(boolean) 
    这里的访问是只读式的并不能修改
      

  2.   

    setAccessible(boolean)
    方法如果参数为true,则跳过访问检查,可以访问的private的域。也可以更改。是破坏了安全性,
    但就是这样设计的,
    可能是因为使用起来方便吧。
      

  3.   

    还有以前比较老的初始化JDBC的代码里,那句 
    Class.forName(驱动类全名) 
    作用是什么啊 作用是把驱动程序的类加载到JVM中. 方便驱动管理程序来实例化驱动对象.(请注意,仅加载类模块)此外,反射里有个方法叫 
    setAccessible(boolean) 
    可以访问类的私有成员和方法,这样难道不会破坏安全性么??通过反射就可以访问私有成员了是的,已经破坏安全性了, 就象C里面的指针一样, 很危险,但很强大
      

  4.   

    java里面任何class都要装载在虚拟机上才能运行。Class.forName就是装载类用的(和new不一样,要分清楚)。 至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?使用方法Class.forName(),不过要再加一点。 
    A a = (A)Class.forName("pacage.A").newInstance(); 
    这和你 
    A a = new A(); 
    是一样的效果。 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段,动态加载和创建Class对象。
      

  5.   

    Class.forName(驱动类全名) 
       1、他是为了加载JDBC驱动架包的 ,为JDBC中实现其接口的, 他还可以加载别的驱动 .
       2、("sun.jdbc.odbc.JdbcOdbcDriver"),用import的话,程序是不会去加载这个class的。只有通过Class.forNamesetAccessible(boolean) 
       能够动态的确定所需要的方法是否可用并调用他们。
      

  6.   

    Thread.currentThread().getContextClassLoader().loadClass()和Class.forName()返回的Class对象会有啥区别没?这个问题应该看看Thread 的getContextClassLoader()的作用。当需要动态加载很多类和资源的时候会用到。上网上搜一下。
      

  7.   

    编译器加载类要依靠classloader, 而classloader有3个级别,从高到低分别是BootClassLoader(名字可能不准确) , ExtClassLoader, AppClassLoader. 
    这3个加载器分别对应着编译器去寻找类文件的优先级别和不同的路径:BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方 
    ExtClassLoader对应jre/lib/ext路径,是编译器次优先寻找class的地方 
    AppClassLoader对应当前路径,所以也是编译器默认找class的地方 
    现在给你分析你的问题我想因为Thread.currentThread().getContextClassLoader().loadClass(className) 
    是线程中的类加载器,直接调用起来效率最高,假设在这三个类加载器都找不到你的类,直接用Class.forname()映射 
    ,这样就要多消耗资源了,一个线程调用资源开销不大,那要是几百个并发呢。个人理解楼主参考一下
      

  8.   

    我是LZ,我知道Thread.currentThread().getContextClassLoader()加载的是应用classLoader,即AppClassLoader,因为你肯定是在自己写的代码里调用的,jvm非JAVA实现的根classloader是肯定不可能被返回的,也不会是ExtClassLoader。我想问的是Class.forName()方法内部是不是调用了前面的ClassLoader。另外,JDBC的初始化那个我还是不懂,干吗非要这一句,平时我们初始那个类不是根本用不着这样吗?如果JDBC里要用到这个类,JAR包里应该有装载这个类的代码吧,不论是new还是Class.forName抑或是ClassLoader.loadClass()
      

  9.   

    加载JDBC驱动获取数据库连接时,即DriverManager.getConnection()中会隐含调用数据库驱动的对象,于是需要在调用这个方法之前,先加载对应数据库的驱动类,如com.ibm.db2.jcc.DB2Driver,生成Class的对象,再通过反射机制获取com.ibm.db2.jcc.DB2Driver。
      

  10.   

    怎么没有下文了呢?8楼“Thread.currentThread().getContextClassLoader().loadClass(className) 效率高”这什么呢?