zoukankan      html  css  js  c++  java
  • java中class.forName(str)的作用

    首先,要说明几点:

    1、class.forName(str)返回的是一个类;

    2、newInstance():弱类型,低效率。只能实例化无参类。

         new():强类型,高效率。可以实例化任何构造函数为public的类;

    3、classforName()动态加载一个类,实现了降耦。

    Class.forName(xxx.xx.xx) 返回的是一个类, .newInstance() 后才创建一个对象 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段

    Class aClass = Class.forName(xxx.xx.xx);
    Object anInstance = aClass.newInstance();


    Class.forName("").newInstance()返回的是object
    but there is some limit for this method to create instance
    that is your class constructor should no contain parameters, and you should cast the instance manually.

    Class Driver{
    protected static Driver current;
    public static Driver getDriver(){
    return current;
    }
    }

    Class MyDriver extends Driver{
    static{
    Driver.current=new MyDriver();
    }
    MyDriver(){}
    }

    用时:
    Class.forName("MyDriver");
    Driver d=Driver.getDriver();

    有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?

    Class.forName(xxx.xx.xx) 返回的是一个类,
    .newInstance() 后才创建一个对象

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

    在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:
    public class MyJDBCDriver implements Driver {
    static {
    DriverManager.registerDriver(new MyJDBCDriver());
    }
    }

    所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了


    下面给一个例子:Class的最大作用就是实现了动态加载类,为多态提供了很好的帮助。
    class A
    {
        
    void aa()
        
    {
            System.out.println (
    "A里的");    
            
        }
        
        
    }

    class B extends A
    {
        
    void aa()
        
    {
            System.out.println (
    "B里的");    
            
        }
        
        
    }

    class C extends A
    {
        
    void aa()
        
    {
            System.out.println (
    "C里的");    
            
        }
        
        
    }



    public class ClassDemo
    {
        
        
    public static void main(String[] args)
        
    {
            ClassDemo t
    =new ClassDemo();
            t.show(
    "C");
        }

        
    void show(String name)
        
    {
            
    try
            
    {
                 A show
    =(A)Class.forName(name).newInstance();
            show.aa();
        }

        
    catch(Exception e)
        
    {
            System.out.println (e);
            }

                
            
        }

        
        
    }
  • 相关阅读:
    树形DP 统计树中长度为K的路径数量——Distance in Tree
    Linux下使用Vi是方向键变乱码 退格键不能使用的解决方法
    wikioi 1029 中序遍历总数
    struts2前端页面读取Clob/BLOB
    hdu 1712 ACboy needs your help
    HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)
    用XMLRPC开服务进行server/client通信
    HDU 1171 Big Event in HDU
    VS2012调试执行,网页打不开
    解决安装OpenShift Client Tools时提示的dl/import (LoadError)问题
  • 原文地址:https://www.cnblogs.com/ningxu/p/3401842.html
Copyright © 2011-2022 走看看