首页 > 代码库 > java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式

java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式

反射:

  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         // 方式216         Class c = Person.class;17         // int.class;18         // String.class;19         System.out.println(c == c1); // true20 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); // true27     }28 29 }

 

java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式