一、反射

Student stu = new Student();
编译期 检测当前对象的实例化是否正确
运行期 只能创建Student类型的对象
stu.toString();
编译期 检测当前对象的方法是否正确
运行期 只能调用当前对象的toString()方法

1. 反射概述

  1. 反射本质是一种实现动态编程的机制<br /> 在运行阶段才确定创建何种类型的对象和调用何种方法的机制<br /> 具体创建的对象和调用的方法由反射的具体来决定

反射机制实现
在运行阶段,获取一个任意一个类的所有信息(属性,方法,构造方法)
调用任意一个对象的方法和属性

2.作用

  1. java中大部分的框架底层都使用反射<br /> 访问加载到jvm中的类的内部信息<br /> 获取已经加载的类的成员属性,类的方法,类的构造方法<br /> 提高程序的灵活性,降低耦合

3.类加载器、类装载器

分类:
启动类加载器:bootstrap
由类加载器:boostrap
由本地代码实现(由c/c++),负责装载jre中的核心类库,例如jre目录下rt.jar,charsets.jar等等

类加载器:extension
由ExtClassLoader类的实现,负责加载jar扩展目录ext下的jar中的类

  1. 类加载器:system<br /> AppClassLoader类实现,负责加载classpath路径下的类<br /> 关系:<br /> system 继承 extension 继承 bootstrap

双亲委派加载机制:
双亲委派加载机制,在类装载时,将装载任务委派给父类加载器,依次向上递归,如果父类加载器能完成装载任务,则直接装载如果无法完成,则让其子类加载

安全性:避免加载子类自定义的系统类(父类已经加载了,并且只加载指定目录下的类)
避免一个类加载多次

装载过程:
1.装载:
查找和导入.class字节码文件
2.链接:
检查,检查当前加载的.class字节码文件是否正确
准备,给类中的静态属性分配储存空间
解析,将符号引用转换成直接引用

  1. 3.初始化:<br /> 对静态变量,静态代码块进行初始化操作<br /> 4.使用<br /> 5.卸载<br />

4. Class类(类型,加载到jvm中的字节码在内存中的表现类型)

Class类的实例表示正在运行的java应用程序中的类/接口
Class类对象
类字节码
类的所有信息
属性、方法、构造方法
获取Class类对象:
1. Class.forName(String fullPath)的方法获取参数指定的类型的Class对象(推荐)
2. 数据类型.class 的方式获取对应的Class对象
3. 对象.getClass()的方式获取对应的Class对象
4. 使用包装类.TYPE的方式获取对应基本类型的Class对象

注意:int.class 和 Integer.class的区别

常用的方法:
static Class<?>forName(String className)
获取参数指定的类型的Class对象
T newInstance()
创建此 Class 对象锁表示的类的一个新实例
Constructor getConstructor(Class<?>… parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象表示的类的指定公共构造方法
Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表
示的类或接口的所有可访问公共字段。
Method getMethod(String name, Class<?>… parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该 类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

5.Constructor类(构造方法类)

  1. 用于描述某一个具体的构造方法类<br /> 获取:<br /> Constructor<T>getConstructor(Class<?>....parameterTypes)<br /> Constructor<?>[] getConstructors()
  2. 常用方法:<br /> T newInstance(Object... initargs);<br /> 通过构造器对象实例化字节码文件对应的类的实例,参数列表传递实际参数<br />

6. Field类

  1. 用于描述某一个成员属性类<br /> 获取:<br /> Field getField(String name) 获取公共的属性对象,可以获取继承的公共属性对象<br /> Field getDeclaredField(String name) 获取在当前类中申明属性对象<br /> Field[] getFields() <br /> Field[] getDeclaredFields()<br /> 注意:在访问私有属性对象时,需要调用setAccessible(true),才允许操作<br /> 常用方法:<br /> Object get(Object obj) <br /> 返回指定对象上此 Field 表示的字段的值。 <br /> void set(Object obj, Object value) <br /> 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

7. Method类

  1. 用于描述某一个成员方法<br /> Method getMethod(String name, Class<?>... parameterTypes) <br /> Method[] getMethods() <br /> Method getDeclaredMethod(String name, Class<?>... parameterTypes) <br /> Method[] getDeclaredMethods()

二、 JVM

  1. java virtual machine 加载运行java应用<br /> JDK > JRE > JVM

1. JVM运行时数据区域

  1. 程序计数器
  2. java虚拟机栈/本地方法栈
  3. 堆和方法区
  4. 运行时常量池
  5. 直接内存

    2.程序计数器

    记录正在执行的虚拟机字节码指定的地址
    PC寄存器
    每个线程都有一个程序计数器
    线程私有

    3. 虚拟机栈

    线程私有
    每一个线程都具有一个java虚拟机栈
    线程中的每一个方法在被调用时,创建一个栈帧,进栈,方法执行完毕后,出栈

所有的栈帧都出栈后,线程执行完毕

栈帧中:存储局部变量,操作数,常量池引用等等信息

StackOverflowError: 方法死递归,造成栈溢出

设置栈的大小:
-Xss20m 设置当前虚拟机栈的大小为20m

4. 堆

线程共享
所有对象,是GC回收的主要区域

堆的划分:
新生代 young generation:eden区+survivor0+survivor1
老年代 old generation :
永久代(取消): metadata space 直接内存

堆溢出:OutOfMemoryError: Java heap space
不断创建对象