JDK: JAVA Development Kit
JRE : JAVA Runtime Environment
JVM: JAVA Virtual Machine
POJO(Plain Ordinary Java Object)简单的Java对象
@Override 覆盖重写
@Deprecated 说明过时的方法
@SuppressWarnings("all")需要传入参数的注解, 禁止显示警告,需要String[]类型的参数
四个元注解:
@interface定义一个注解
@Target: 注释类型适用的上下文,定义目标注解可以定义在哪一个地方。如ElementType.FIELD ElementType.METHOD ElementType.TYPE
@Retention(RUNTIME):指示带注释类型的注释将保留多长时间。如果注释类型声明中没有保留注释,则保留策略默认为 RetentionPolicy.CLASS。或者说是表示注解的有效域,一般默认的写法是RetentionPolicy.RUNTIME
@Documented:表示当前注解将要生成在对应的文档中。
@Inherited:表示子类可以继承父类
自定义注解的简单定义:
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface Myannotion {
String name() default "";//作为注解的参数,注解类型+参数名();
//这里注解默认值设置为空,当Target参数没有默认值时,必须要显示的设置初值
int id() default -1;//如果为-1代表不存在。
//有默认值的可以不写,只写没有 设置初值的参数。
//value 参数在参数赋值的时候可以直接写,不用再写value这个参数名
}
运行的时候创建对象可以用反射来实现,基本的创建可以New Clone
动态语言:运行的时候可以改变其结构的语言
静态语言: 可以通过反射来实现运行时动态调节,基本的数据类型和结构都是不可变数据类型,内容存放再栈结构中。
常用的JAVA反射类:
java.lang,class
java.lang.reflect.Field
java.lang.reflect.Array
java.lang.reflect.Method
java.lang.reflect.Constructor
通过反射获得String类型参数的对象:
Class.forName("");
思想:想要运行时创建新的对象,
首先要获得想要创建的类对象所对应的公共类,class。
每个类都有一个最原始的class属性。
Class类创建的几种方式:
-
通过对象获得:类对象. getClass()
-
forname: Class. forName("类路径")
-
通过类名:类名. class
-
基本内置不可变数据类型的Type属性:例如Integer. TYPE
另外继承父类的对象,可以通过 类对象名
//所有类型的Class
public class Test04 {
public static void main(String[] args) {
Class c1 = object.class; //类
Class c2 = Comparable.class; //接口
Class c3 = String[].class; //- 维数组
Class c4 = int[][] .class; //二维数组
Class c5 = override.class; //注解
Class c6 = ElementType.class; //枚举
Class c7 = Integer .class; // 基本数据类型
Class c8 = void.class; //void
Class c9 = Class.class; //Class
}
获得Class只和类对象或者类的类型有关,和类对象,类变量的大小长度都没有关系!
Java内存的分析
装载:将编译好的class字节码文件内容加载到内存中,形成方法区运行时的数据结构,生成一个代表这个类的java. lang. Class对象
链接:
-
验证:确保字节码文件的类信息符合规范
-
准备: 为静态变量分配内存,或者设置初始值
-
解析: 常量池中的常量转化为绝对地址的过程
初始化:
-
执行类构造器,由clinit()方法将各种解析出的变量和赋值操作构成可以执行类文件
-
如果发现类的父类还未初始化则需要先触发其父类的初始化
-
虚拟机可以满足多线程环境下,clinit()构造类的时候正确的进行同步操作,比如单线程下多个事物调取一个资源的同步过程,虚拟机可以实现这种有条不紊的加锁和同步。