java反射原理,动态加载(软件版本升级)

来源:互联网 发布:java获取服务器ip地址 编辑:程序博客网 时间:2024/06/07 00:25

1,类是对象,类是 java.lang.Class 类的实例对象


2,Class 类的构造方法只能 jvm 访问。


3,定义一个类并实例化

      Foo foo1 = new Foo();

     任何一个类都是 Class 类的实例对象,这个实例对象有三种表示方法

     (1),Class c1 = Foo.class      //实际告诉我们任何一个类都有一个静态成员变量 class

     (2),Class c2 = foo1.getClass()        //通过调用该类的对象的 getClass 方法 

     (3),Class c3 = null ;

             c3 = Class.forName( pageName.className);

             c1 , c2 ,c3 表示了 Foo 类的类类型( class type ),不管 c1 还是 c2 都代表 Foo 的类类型,一个类只能是Class的一                 个实例对象,所以 c1 == c2 返回的是 true 。


4,通过类类型构造类的对象

      Foo foo1 = ( Foo ) c1.newInstance()      //前提是该类有无参的构造方法


5,动态加载与静态加载

     new 创建对象是静态加载类,在编译过程中会加载所有可能使用到的类。

     class Test{

          public static void main (String [] args){ 

            if("word".equals(args[0])){

               Word word = new Word();

               word.start()

            }

            if("excel".equals(args[0])){
               Excel excel = new Excel();
               excel.start();
            }

          }

          class Word{

               public void start(){

               }

          }

     }

     虽然不一定用到所有方法,但是由于Excel方法没有定义,编译不会通过,如果有一个项目有100个功能,有一个有问           题,那么整个项目就不能部署了。 可以通过动态加载改进:

     //动态加载类,在运行时刻加载

     Class c = Class.forName( args[0] );

     //通过类类型创建该类对象

     Word word = c.newInstance();

     //但是不确定要创建的是Word还是Excel,可以给两者指定一个标准 

     (1) interface Office {

               public void start ();

           }

     (2)class Word implements Office{      

                public void start(){

             }

          }

      (3)Office of = c.newInstance();


6,应用: 软件版本升级

      版本更新不需要改动代码,只需加入新功能并实现 Office 接口即可

原创粉丝点击