1.什么是反射机制,反射机制的优缺点.
Java反射机制是在运行过程中,对于任意一个类,都可以知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取信息,动态调用的方法称为java反射机制
反射机制的优缺点:
缺点:性能差,比直接的java代码慢很多.
优点:灵活性高.运行期类型的判断,动态加载类.
2.反射机制的应用场景
我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计,开发都与反射机制有关,
例如模块化的开发,通过反射去调用对应的字节码.
动态代理设计模式也采用了反射机制.
还有我们日常使用的Spring/SpringMVC/Mybatis等框架也大量使用到了反射机制
3.Java获取反射的三种方法
(1)通过new对象实现反射机制
(2)通过路径实现反射机制
(3)通过类名实现反射机制
4.Lambda表达式
Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中).
使用Lambda表达式可以使代码变得更加简洁紧凑
是对函数式接口的另外一种重写形式
函数式接口(接口中只有一个抽象方法)
5.Optional
Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,
使用Optional类可以避免显式的null值判断(null的防御性检查),避免null导致的NPE(NullPointerException)
6.JVM运行流程
首先通过编译把Java代码转换成字节码文件,然后类加载器(ClassLoader)再把字节码文件加载到内存中,放在运行时数据区的方法区内,然后需要特定的命令解析器执行引擎,
将字节码翻译成底层系统指令,再交由CPU去执行.
7.说一下JVM运行时数据区
Java虚拟机在执行Java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域.
这些区域都有各自的用途,以及创建和销毁的时间.
有些区域随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销毁.
Java虚拟机所管理的内存被划分为如下几个区域:
方法区, 虚拟机栈,本地方法栈,堆,程序计数器.
程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,
分支,循环,跳,转,异常处理,线程恢复等基础功能,都需要依赖这个计数器来完成:为什么要线程计数器?因为线程是不具备记忆功能.
Java虚拟机栈(Java Virtual Machine Stacks):每个方法在执行的同时都会在虚拟机栈中创建一个栈帧(Stack Frame) 用于储存局部变量表,操作数栈,动态链接,方法出口等信息;
栈帧就是Java虚拟机栈的下一个单位.
本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务Java方法的,而本地方法栈是为虚拟机调用Native方法服务的;Native关键字修饰的方法
是看不到的,Native方法的源码大部分都是C和C++的代码.
Java堆(Java Heap):Java虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例,都在这里分配内存;
方法区(Method Area):用于储存已被虚拟机加载的类信息,常量,静态变量,即时翻译后的代码等数据.
8.说一说你对Java堆的理解?
Java堆(Java Heap) 是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例.
在Java虚拟机规范中描述的是:所有的对象实例以及数组都要在堆上分配.
java堆是垃圾收集器管理的主要区域,因此也被称为"GC堆"
9.对Java方法去的理解?
方法区是所有线程共享的内存区域,它用于储存已被Java虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据.
10.知道直接内存吗?
直接内存(Direct Memory) 并不是虚拟机运行时数据区的一部分,也不是Java虚拟机中定义的内存区域,
直接内存是基于物理内存和Java虚拟机内存的中间内存.
标签:反射,面试题,Java,虚拟机,Day07,线程,内存,方法 From: https://www.cnblogs.com/carney/p/17039346.html