java基础总结(面试高频问题)三:反射机制,Class.forName和classloader的区别

1:什么是反射:
在运行状态下,对于任意的一个类,可以获取它的所有属性和方法;对于任意一个对象,可以调用它的任意一个方法和属性(包括私有的方法和属性)。这种动态获取信息以及动态调用对象的功能就叫做java的反射机制。简而言之,反射可以实现运行时知道任意一个类的方法和属性;

2:反射机制的意义:
例如C++,java都是静态编译的语言,在编译时必须知道变量的类型才能编译通过。(python属于动态编译的语言,在编译时不需要知道变量的类型,只要在运行时指明其类型即可);
java是一种解释性的语言,编译器首先将源代码.java文件编译为.class文件,然后虚拟机JVM再把.class文件解释给目标计算机执行。反射机制就是操作编译后的.class文件的,先将.class文件加载到内存中,然后解析获取文件中的构造函数,方法,属性等。

3:反射的优缺点:
(1)反射的优点:使用反射,可以在运行时获取类的各种内容,进行反编译(从.class文件到.java文件的操作),对于java这种先编译后运行的语言,能够让我们创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的连接,更加容易实现面向对象;
(2)反射的缺点:
<1>反射会消耗一定的系统资源,因此,如果不需要动态创建一个对象,那么就不要用反射;
<2>反射调用方法是可以忽略权限检查,因此会破坏封装性而导致安全问题;

4:反射的应用场景举例:
(1)反编译:.class到.java
(2)通过反射机制访问java对象的属性,方法,构造方法等
(3)IED中自动显示对象或类的方法列表,方便快速查阅
(4)反射机制最重要的用途就是通用框架的开发,框架写好后,方便使用时根据项目需求的不同来动态加载需要的对象

5:反射机制常用的类:
Java.lang.Class;
Java.lang.reflect.Constructor;
Java.lang.reflect.Field;
Java.lang.reflect.Method;
Java.lang.reflect.Modifier;

6:反射的基本使用:
(1)获取某个类(Student)的Class对象的三种方法:
<1>通过Student类隐藏的静态变量来获取
Class c1=Student.class;
<2>通过Stduent的对象student调用getClass()方法
Student student=new Student();
Class c2=student.getClass();
<3>通过Student类的完全包路径来获取
Class c3=Class.forName(“com.tyf.reflect.Student”);
注意:在运行期间,一个类,只能有一个class对象产生,因此上述三种方法获取的都是同一个对象;
(2)例如通过反射获取构造方法,获取成员方法,获取成员变量等等,详见博客:https://blog.csdn.net/a745233700/article/details/82893076
https://blog.csdn.net/sinat_38259539/article/details/71799078
(3)通过反射机制可以越过泛型的检查,因为泛型用于编译期,编译过后泛型擦除,所以可以越过泛型的检查;
例如:List集合中泛型为String,通过反射可以存入int类型数据

在这里插入图片描述

输出:

在这里插入图片描述

7:Class.forName和classloader的区别:
相同点:java中的Class.forName()和classloader都可以对类进行加载;
不同点:Class.forName()除了将类的.class文件加载到JVM中,还会对类进行解析,执行类中的static块(静态代码块和静态变量赋值等操作)。而classloader只负责将.class文件加载到JVM中,不会去执行static块中的内容,只有在调用newInstance()方法时才会去执行static块;

在这里插入图片描述

Class.forName()方法实际上也是调用classloader来实现的,通过源码分析可以看到,

在这里插入图片描述

最后调用的方法是forName0这个方法,在这个forName0方法中的第二个参数被默认设置为了true,这个参数代表是否对加载的类进行初始化,设置为true时会类进行初始化,代表会执行类中的静态代码块,以及对静态变量的赋值等操作;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值