zoukankan      html  css  js  c++  java
  • Java反射机制

         一,反射是什么鬼:

        动态语言:程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言

        java的反射机制在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的任意一个方法和属性

               java具有一定的动态特性,但还不是动态语言,改不了程序结构或变量类型

     

          二,反射机制的作用:

                  1,反编译:.class-->.java

                  2,通过反射机制访问java对象的属性,方法,构造方法等;

         3.动态加载类(无需全编译程序即可更新部分功能),这里来个示例:效果是在不重新编译Main的情况下,添加一个类,调用这个类的方法!

           先思考如下方式:

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         if("Word".equals(args[0])){
     5             new Word().start();
     6         }
     7         if(...)
     8     }
     9 
    10 }

    这就写死了,如果要调用PPT类的start()方法,必须要再添加判断PPT的代码,并且要重新编译整个程序!!

    同时可以看出:通过new方式创建对象,是静态加载的,即在编译的时候,必须确保所有可能用到的类都已存在!

    下面,通过反射的方式,可以动态加载!

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         try {
     5             Class c = Class.forName(args[0]);
     6             TestInterface t = (TestInterface) c.newInstance();
     7             t.start();
     8         } catch (Exception e) {
     9             e.printStackTrace();
    10         }
    11     }
    12 }
    13 
    14 interface TestInterface {
    15     public abstract void start();
    16 }
    17 
    18 class Word implements TestInterface {
    19 
    20     @Override
    21     public void start() {
    22         System.out.println("Word is starting");
    23     }
    24 }

    此时编译Test.java   再java Test Word,执行是没有任何问题的

    在此基础上,新建一个PPT类,实现TestInterface

    1 public class PPT implements TestInterface {
    2 
    3     @Override
    4     public void start() {
    5         System.out.println("PPT is starting");
    6     }
    7 }

    只编译这一个PPT.java    即javac PPT.java    此时再执行   java Test PPT,同样可以正常执行

    这就实现了动态加载类

     

          三,反射涉及到的类:

      java.lang.Class;

        Object类是最高级领导,它有个方法getClass():用于获取类的类类型!!每个类有且只有一个类类型!!

        类类型可以干嘛?  答:获取类的方法属性,创建对象,调用对象方法属性这些都要靠类类型,获取到类类型是第一步工作!!!

        获取类类型的三种方式:

            //第一种方式:  
            Class c1 = Class.forName("A"); 
            
            //第二种方式:  
            Class c2 = A.class;  
               
            //第三种方式:  
            Class c3 = new A().getClass(); 

      四、获取方法信息

  • 相关阅读:
    浅谈Sass与Less区别、优缺点
    混合开发的几个框架
    什么是Node.js?
    初入AngularJS
    jQuery的效果函数
    jQuery的一些选择器
    CSS3新增的属性有哪些:
    linux 新建用户、用户组 以及为新用户分配权限
    linux各个文件作用
    Linux CentOS6.5 命令修改网络配置
  • 原文地址:https://www.cnblogs.com/erhai/p/5169833.html
Copyright © 2011-2022 走看看