一、JVM如何加载.class文件
- ClassLoader:依据特定格式,加载class文件到内存
- Execution Engine:对命令进行解析
- Native Interface:融合不同开发语言的原生库为Java所用
- Runtime Data Area:JVM内存空间结构模型
二、反射的概念
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象的功能称为Java语言的反射机制
反射的例子
package javabasic; public class Robot { private String name; public void sayHi(String helloSentence) { System.out.println(helloSentence+" "+name); } private String throwHello(String tag) { return "Hello"+tag; } }
package javabasic; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class reflect { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException { Class rc = Class.forName("javabasic.Robot"); Robot r = (Robot)rc.newInstance(); System.out.println("Class name is "+rc.getName()); Method getHello = rc.getDeclaredMethod("throwHello", String.class); getHello.setAccessible(true); Object str = getHello.invoke(r, "Bob"); System.out.println("getHello result is "+str); Method sayHi = rc.getMethod("sayHi", String.class); sayHi.invoke(r, "Welcome"); Field name = rc.getDeclaredField("name"); name.setAccessible(true); name.set(r, "Alice"); sayHi.invoke(r, "Welcome"); } }
三、ClassLoader的种类
BootStrapClassLoader:加载Java核心API
ExtClassLoader:加载扩展API
AppClassLoader:加载classpath下的class
自定义ClassLoader
四、类加载器的双亲委派机制
五、类的加载方式
隐式加载:new
显示加载:loadClass,forname
六、Java内存模型
Java内存模型
线程独占部分:程序计数器、本地方法栈、虚拟机栈
线程共享部分:MetaSpace、堆
Java堆:对象实例的分配区域;GC管理的主要区域