JAVA的反射机制你了解多少

 更新时间:2022年02月05日 11:20:58   作者:橘子恶霸280  
这篇文章主要为大家详细介绍了JAVA的反射机制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

1、什么是反射?

在java开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一。

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的。

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何
类的内部信息,并能直接操作任意对象的内部属性及方法。

一个类有多个组成部分,例如:成员变量、方法、构造方法等,反射就是加载类,并解剖出类的各个组成部分。

2、反射能够干什么?

Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。如eclipse中,一按点,编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择。这就是利用了Java反射的原理,是对我们创建对象的探知、自审。

反射能够做到:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法;
  • 在运行时获取泛型信息;
  • 在运行时调用任意一个对象的成员变量和方法;
  • 在运行是处理注解;
  • 生成动态代理;

3、反射相关API 

  • java.lang.Class:反射的源头
  • java.lang.reflect.Method:方法
  • java.lang.reflect.Field:属性
  • java.lang.reflect.Constructor:构造器…

4、Class类的理解

(1)、介绍:

程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)。接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中。此过程就称为类的加载。加载到内存中的类,我们就称为运行时类,此运行时类,就作为Class的一个实例。

换句话说,Class的实例就对应着一个运行时类。

加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同的方式
来获取此运行时类。

(2)、类的加载过程:

①加载:

在我们new对象或者使用Class.forName("包名.类")时类加载器(ClassLoader)会将类加载到内存中,并且创建一个Class对象

如何获取Class对象?

JAVA

  • 类.class
  • 对象.getClass()
  • Class.forName(“包名.类”);

②链接:

链接所做的工作主要是验证字节码是否合法,为static 分配内存空间并且初始化(并非真正的初始化,只是将对应类型的变量给上默认值,比如int给0,double给0.0),解析

③初始化

真正的初始化

④使用

类的正常使用

⑤卸载

从内存中卸载(不需要我们关心何时卸载,由JVM去做)

(3)类加载器

类(CLASS) 只有被加载到 JVM 中后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,组织成为一个完整的Java应用程序。这个加载的过程是由类加载器来完成的,具体来说,就是由ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中!

类加载器的分类:

1.BootStrap:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoaderAPPClassLoader

2.ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar包;

3.AppClassLoader:主要负责加载应用程序的主函数类(自己编写的java文件是这个类加载器加载的);

System.out.println("app:" + System.getProperty("java.class.path"));
System.out.println("ext:" + System.getProperty("java.ext.dirs"));
System.out.println("----bootstrap---");
String[] str = System.getProperty("sun.boot.class.path").split(";");

for (String s : str) {
    System.out.println(s);
}

双亲委托(派)机制:

img

当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。那么有人就有下面这种疑问了?

为什么要设计这种机制

这种设计有个好处是,如果有人想替换系统级别的类:String.java。篡改它的实现,在这种机制下这些系统的类已经被Bootstrap classLoader加载过了(为什么?因为当一个类需要加载的时候,最先去尝试加载的就是BootstrapClassLoader),所以其他类加载器并没有机会再去加载,从一定程度上防止了危险代码的植入。

总结

本篇文章就到这里了,希望能给您带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Spring将MultipartFile转存到本地磁盘的三种方式

    Spring将MultipartFile转存到本地磁盘的三种方式

    在Java中处理文件向来是一种不是很方便的操作,然后随着Spring框架的崛起,使用Spring框架中的MultipartFile来处理文件也是件很方便的事了,今天就给大家介绍Spring将MultipartFile转存到本地磁盘的方式,需要的朋友可以参考下
    2024-10-10
  • mybatisPlus更新策略导致更新失败问题

    mybatisPlus更新策略导致更新失败问题

    这篇文章主要介绍了mybatisPlus更新策略导致更新失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 如何在SpringBoot中使用Spring-AOP实现接口鉴权

    如何在SpringBoot中使用Spring-AOP实现接口鉴权

    这篇文章主要介绍了如何在SpringBoot中使用Spring-AOP实现接口鉴权,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • springboot中使用自定义两级缓存的方法

    springboot中使用自定义两级缓存的方法

    这篇文章主要介绍了springboot中使用自定义两级缓存的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • swing登录注册界面设计

    swing登录注册界面设计

    这篇文章主要为大家详细介绍了swing登录注册界面的设计方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 关于Java的二叉树、红黑树、B+树详解

    关于Java的二叉树、红黑树、B+树详解

    这篇文章主要介绍了关于Java的二叉树、红黑树、B+树详解,能同时具备数组查找快的优点以及链表插入和删除快的优点的数据结构就是树,需要的朋友可以参考下
    2023-05-05
  • Java数据结构之对象的比较

    Java数据结构之对象的比较

    比较对象是面向对象编程语言的一个基本特征,下面这篇文章主要给大家介绍了关于Java数据结构之对象的比较,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Java排序算法三之归并排序的递归与非递归的实现示例解析

    Java排序算法三之归并排序的递归与非递归的实现示例解析

    这篇文章主要介绍了Java排序算法三之归并排序的递归与非递归的实现示例解析,文章通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • spring boot中使用@Async实现异步调用任务

    spring boot中使用@Async实现异步调用任务

    本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 解读RedisTemplate的各种操作(set、hash、list、string)

    解读RedisTemplate的各种操作(set、hash、list、string)

    这篇文章主要介绍了解读RedisTemplate的各种操作(set、hash、list、string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论