# interview **Repository Path**: phpsong/interview ## Basic Information - **Project Name**: interview - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-10-09 - **Last Updated**: 2023-04-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 1. 为什么JVM不直接将源码解析成机器码去执行 - 准备工作:每次执行都需要进行各种检查,如语法校验 - 兼容性:也可以将别的语言解析成字节码 2. 如何查看.class字节码:使用javap -c指令 3. JVM的主要组成部分?及其作用 1. 类加载器(ClassLoader) 2. 运行时数据区(Runtime Data Area) 3. 执行引擎(Execution Engine) 4. 本地库接口(Native Interface) 组件作用:首先类加载器(ClassLoader)会把JAVA的代码转换成字节码,运行时数据区(Runtime Data Area)把字节码加载到内存,字节码不能直接别系统识别,执行引擎(Execution Engine)蒋字节码翻译成系统指令,而 这个过程中需要调用其他语言的用本地库接口(Natve Interface)实现 ![](F:\phpsong\interview\images\3306a78303972676d642e6a7067.jpg) 4. 什么是反射 1. Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 2. 写一个反射的例子: ```java public class Robot { private String name; public void sayHi(String helloSentence) { System.out.println(helloSentence + " " + name); } private String throwHello(String tag) { return "Hello " + tag; } } ``` ```java public class ReflectSample { public static void main(String[] args) throws Exception { Class rc = Class.forName("com.tuyrk.reflect.Robot"); Robot robot = (Robot) rc.newInstance(); System.out.println("Class name is " + rc.getName()); //private私有方法 Method getHello = rc.getDeclaredMethod("throwHello", String.class);//可以获取所有(包括私有方法)自定义的方法,不能获取继承或者实现接口的方法 getHello.setAccessible(true);//throwHello方法为私有方法,默认为false Object str = getHello.invoke(robot, "Bob"); System.out.println("getHello result is " + str); //public公有方法 Method sayHi = rc.getMethod("sayHi", String.class);//只能获取public方法,但是可以获取继承或接口的方法 sayHi.invoke(robot, "Welcome"); //私有属性 Field name = rc.getDeclaredField("name"); name.setAccessible(true); name.set(robot, "Alice"); sayHi.invoke(robot, "Welcome"); } } ``` 5. ClassLoader的种类 1. BootStrapClassLoader:C++编写,加载核心库java.* 2. ExtClassLoader:Java编写,加载扩展库javax.* 3. AppClassLoader:Java编写,下载程序所在目录 4. 自定义ClassLoader:Java编写,定制化加载 6. ClassLoader的双亲委派机制 1. 当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。 2. 当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。 3. 如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载; 4. 若ExtClassLoader也加载失败,则会使用AppClassLoader来加载,如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException。 7. 为什么要使用双亲委派机制去加载类 1. 避免多份同样字节码的加载,内存是相当宝贵的,没有必要保存两份一样的类对象,即Class对象 8.