• 周六. 7 月 13th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

java 27

admin

11 月 28, 2021

反射:

  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 }

发表回复