注解
1:黄色标注 不是必须但是有的需要。
2:@+注释名 还可加一些注释参数值
3:相当于提供一些辅助信息
4:例:
@override------重写注解
@Deprecated 不鼓励使用但是可以使用 或者存在更好的方式
@SuperpressWarning 镇压警告信息 用来编译报错警告等信息
元注解
负责解释其他注解的注解
1例:@Target 描述使用范围
@Retention 在什么级别保存注解信息 (source<class<runtime)等 ------------描述注解的生命周期
反射机制
静态语言:运行时结构不允许改变 java、c、c++等
动态语言:运行时可以根据某些条件改变结构 例如:javaScirp、PHP
但是java的反射机制使得java成为了“准动态语言” (java的反射机制使得其可以获得类似动态语言的特性,使得java编程更加灵活)但同时也变得不安全(在运行是可以修改java程序的结构使得程序变得不再安全)
Reflection 允许程序在执行期间 借助Reflection API获取任何类的内部信息,并可以直接操作任意对象内部的属性和方法。
代码加载完后堆区就会产生一个class对象,该对象就包含了这个类的完成结构信息,使得可以通过该类获取到类的结构信息 称其为反射
正常方式:
引入对象类包------->通过new 实例化对象---------->获取实例化对象
反射机制:
实例化对象------------->利用getClass()方法--------------->获取该对象完整的包类信息
反射创建实例化对象:
1:反射创建的对象用newinstance创建 默认用无参构造创建
或者
2:可以通过构造器获取对象,类.getDeclaredConstructor(参数列表) 然后再用上述构造方法实例化。
反射的优点和缺点
优点:实现动态创建对象和编译,更灵活
缺点:由于是解释性操作会影响到性能
对应方法
Class c1=Class.ForName("包名+类名")
c1. ---->可以获取方法、字段、父类对象等信息
由于一个类只有一个对象,所以其反射回来的对象都是一个,其对应的hashcode都是同一个哈希值。
类在被加载后整个结构都会被封装到Class 对象中
object类定义了getclass 返回值为Class类,则为反射的源头 --------------->也就是一个逆过程就是通过对象名可以获取类的名称等
new<------->反射
Class类
1:每个类的实例对象都可以知道是哪个Class示例所生成
2:通过Class可以完整的得到一个类中索所有被加载的结构
3:要想获取动态加载运行的类必须首先获取相应的Class对象
谁有Class对象:
class、interface、[]数组、enum(ELementType)、基本数据类型(int long short boolean char float double byte )、void
//只要元素类型与维度一样就是同一个Class类
类内存加载分析
过程:
类的加载(将class文件载入内存并创建类对应的 Class对象有类加载器完成)
类的链接:将java二进制代码合并到java虚拟机中JRE
初始化:JVM负责初始化--->类构造器-->构造类信息并不是构造类对象
(先执行静态代码块-->静态变量-->执行)
堆:1----------方法区---->可被所有线程共享,包含所有的class和static变量
2 堆:存储new的对象和数组,可被所有的线程所共享,不会存放别的对象引用
栈:存放基本的变量类型(包括具体数值)以及引用对象的变量
类加载器:把类加载到内存中
1:引导类加载器
2:扩展类加载器
3:系统类加载器
类的初始化
类的主动引用:
1:先初始化main方法所在类
2:new一个新的对象
3:反射实现对类的调用
4:初始化类。若其的父类没有被初始化,则会优先初始化他的父类
类的被动引用(不会发生类的初始化)
1:数组
2:子类的常量也不会引起父类和子类的初始化