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

Posted 卡拉瓦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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         // 方式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 }

 

以上是关于java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式的主要内容,如果未能解决你的问题,请参考以下文章

java 27 - 3 反射之 通过反射获取构造方法并使用

java 27 - 9 反射之 动态代理的概述和实现

Java之反射机制

Java基础之—反射

Java进阶篇之反射

Java进阶篇之反射