注解和反射

注解

1:黄色标注 不是必须但是有的需要。

2:@+注释名 还可加一些注释参数值

3:相当于提供一些辅助信息

4:例:

@override------重写注解

@Deprecated 不鼓励使用但是可以使用 或者存在更好的方式

@SuperpressWarning 镇压警告信息 用来编译报错警告等信息

元注解

负责解释其他注解的注解

1例:@Target 描述使用范围

@Retention 在什么级别保存注解信息 (source

反射机制

静态语言:运行时结构不允许改变 java、c、c++等

动态语言:运行时可以根据某些条件改变结构 例如:javaScirp、PHP

但是java的反射机制使得java成为了“准动态语言” (java的反射机制使得其可以获得类似动态语言的特性,使得java编程更加灵活)但同时也变得不安全(在运行是可以修改java程序的结构使得程序变得不再安全)

Reflection 允许程序在执行期间 借助Reflection API获取任何类的内部信息,并可以直接操作任意对象内部的属性和方法。

代码加载完后堆区就会产生一个class对象,该对象就包含了这个类的完成结构信息,使得可以通过该类获取到类的结构信息 称其为反射

正常方式:

引入对象类包------->通过new 实例化对象---------->获取实例化对象

反射机制:

实例化对象------------->利用getClass()方法--------------->获取该对象完整的包类信息

反射创建实例化对象:

1:反射创建的对象用newinstance创建 默认用无参构造创建

或者

2:可以通过构造器获取对象,类.getDeclaredConstructor(参数列表) 然后再用上述构造方法实例化。

注解和反射_第1张图片

反射的优点和缺点

优点:实现动态创建对象和编译,更灵活

缺点:由于是解释性操作会影响到性能

对应方法

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:子类的常量也不会引起父类和子类的初始化

你可能感兴趣的:(java,java)