Java的反射总结

类的加载机制

image-20201130142038371

  • 类加载:一旦某个类被载入JVM中,同一个类就不会再次加载

反射的定义

  • Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审",并能直接操作程序的内部属性。
  • 使用反射可以获得Java类中各个成员的名称并显示出来。简单的说,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。
  • —句话:运行时探究和使用编译时未知的类。

反射的原理

对象创建过程:比如要创建Dog类的三个对象

Dog d1 = new Dog();
Dog d2 = new Dog();

Dog d3 = new Dog();

在这个过程中,JVM的底层实现过程如下:

1.JVM利用DogClassLoader先将Dog类加载到内存,然后马上产生了一个Class类型的对象,该对象可以看成是一个模型,以后无论创建多少个Dog类的实例都是利用该模型来生成。

所以一个类所对应的Class类型的对象只有一个。

2.根据这个模型生成Dog类的三个实例d1、d2、d3。反射正是利用了java的这种加载方式主动完成了对象的创建及使用。

反射的使用步骤

  1. 三种获取class对象:
    1. 对象.getclass();
    2. 类名.class
    3. Class.forName(“包名.类名”)
  2. 探究类的信息
    • 一个类通常由三部分组成—属性、普通方法、构造方法。
    • Filed类
      • field.setAccessible(false) 开启语法检查
      • field.set();
    • Method类
    • Constructor类
    • Method类
    • Constructor类
    • Modifier类 返修饰符
			Class cla;							//创建Class对象
			cla.getField("");                   //获取指定名称的公共属性
            cla.getFields();                    //获取指定名称的所有公共属性
            cla.getDeclaredField("");           //获取指定名称的任意属性
            cla.getDeclaredFields();            //获取所有属性

            cla.getMethod("");                  //获取指定名称的公共方法
            cla.getMethods();                   //读出对象的所有方法,包括继承object类和父类的所有方法
            cla.getDeclaredMethod("");          //获取指定名称的任意方法
            cla.getDeclaredMethods();           //获取所有方法时,只会获取当前类中显式出现的方法

            cla.getConstructor();               //获取指定名称的公共构造函数
            cla.getConstructors();              //获取指定名称的所有公共构造函数
            cla.getDeclaredConstructor();       //获取指定名称的任意构造函数
            cla.getDeclaredConstructors();      //获取所有构造函数*/
            5. field.set();//反射机制中只要给定指定包名下的类名,无论对象的属性是私有还是公共的 都可以访问并修改,属于暴力破解。所以不能轻易使用 ,有很大隐患。

希望大家能够互相学习,谢谢大家!

猜你喜欢

转载自blog.csdn.net/qq_42039952/article/details/115058297