zoukankan      html  css  js  c++  java
  • java 27

    反射:

      JAVA语言的反射机制:

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

        对于任意一个对象,都能够调用它的任意一个方法和属性;

        这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

      如何解剖一个类:

        要想解剖一个类,必须先要获取到该类的字节码文件对象。

        而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

    通俗的来说:  

      反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。

              Person p = new Person();

              p.使用

     要想这样使用,首先你必须得到class文件对象,其实也就是得到Class类的对象。

        Class类:

          成员变量   Field

          构造方法   Constructor

          成员方法   Method

    获取Class文件对象的方式: 

      1: Person p = new Person();

        Class c = p.getClass();

      2:Class c2 = Person.class;

        任意数据类型都具备一个class静态属性,看上去要比第一种方式简单.

      3:将类名作为字符串传递给Class类中的静态方法forName即可

        Class c3 = Class.forName("Person");

    第三种和前两种的区别

      前两种你必须明确Person类型.

      后面是你我这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了

    一般我们到底使用谁呢?

      A:自己玩 任选一种,第二种比较方便

      B:开发 第三种

        因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中。(可变)

    首先建个Person类,以便用来解剖。

    解剖的代码体现:

      

     1 public class RelfectDemo {
     2 
     3     public static void main(String[] args) throws ClassNotFoundException {
     4 
     5         // 方式1
     6         Person p1 = new Person();
     7         Class c1 = p1.getClass();
     8 
     9         Person p2 = new Person();
    10         Class c2 = p2.getClass();
    11 
    12         System.out.println(p1 == p2); // false 开创了2个不同的空间
    13         System.out.println(c1 == c2); // true 2个Class都是得到同一个字节码文件对象
    14 
    15         // 方式2
    16         Class c = Person.class;
    17         // int.class;
    18         // String.class;
    19         System.out.println(c == c1); // true
    20 
    21         // 方式3 Class.forName(className); 里面的文件名是要全路径的
    22         // 这个方法里面的文件名有两种获得方式23         // 一:在外面写 zl_Relfect.Person(包名加类名),再复制粘贴进去
    24         // 二:右键点击想要获得的类,点击Copy Qualified Name,再粘贴进去
    25         Class c3 = Class.forName("zl_Relfect.Person");
    26         System.out.println(c3 == c1); // true
    27     }
    28 
    29 }
  • 相关阅读:
    【noip2012】开车旅行
    【AC自动机】专题总结
    【noi2013】【bz3244】树的计数
    BZOJ1069: [SCOI2007]最大土地面积
    BZOJ1185: [HNOI2007]最小矩形覆盖
    BZOJ1047: [HAOI2007]理想的正方形
    BZOJ1801: [Ahoi2009]chess 中国象棋
    BZOJ1925: [Sdoi2010]地精部落
    BZOJ1057: [ZJOI2007]棋盘制作
    BZOJ1217: [HNOI2003]消防局的设立
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5965928.html
Copyright © 2011-2022 走看看