目录标题
- 注解
- 什么是内置注解
- 元注解
- 自定义注解
- 反射机制
- 获得反射对象
- 得到Class类的几种方式
- 所有类型的Class对象
- Java类内存分析
- 类的加载过程
- 分析类初始化
- 重点!!! 类的主动引用(一 定会发生类的初始化) 包括以下几类: 当虚拟机启动,先初始化main方法所在的类 new 一个类的对象 调用类的静态成员(除了final常量)和静态方法 使用java.lang.reflect包的方法对类进行反射调用 当初始化 一个类,如果其父类没有被初始化,则先会初始化它的父类
- 类的被动引用(不会发生类的初始化) 包括以下几类: 当访问一个静态城时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化 通过数组定义类引用,不会触发此类的初始化 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
- 产生类的引用的方法的输出结果为下面的第二张图 而不会产生类的引用的方法的输出结果 我放在了图中的注释中!!!
- 类加载器(面试会问)
- 创建运行时类的对象
- 获取类的运行时结构
- 有了Class对象 能做什么
- 性能对比分析
- 获取泛型信息
- 获取注解信息
- 总结
注解
所有的框架底层实现原理就是注解和反射
例如 mybatis和Springboot
注解:可以给人看 也能给程序看


什么是内置注解
注解一定要用@开头

注解@Override

注解@Deprecated
不推荐程序员使用 但是可以使用 或者存在更好的方式

@SuppressWarnings 镇压警告

元注解
元注解的作业就是负责注解其他注解

自定义注解

重点:自定义注解 一定要有 @ 符号
如果只有 interface 就不是注解 这就是一个接口

反射机制
反射机制非常重要

动态语言:通俗来讲就是在运行时代码可以根据某些条件改变自身结构
静态语言:与动态语言相对的 运行时结构不可变的语言就是静态语言
Java不是动态语言,但Java可以称之为“准动态语言”因为Java有一定的动态性,
我们可以利用反射机制获得类似动态语言的特性。Java的动态性让编程的时候更加灵活!
所以这是很强大的 但是也增加了 不安全性

Reflection (反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

获得反射对象

一个类在内存中只有一个Class对象
一个类被加载后 类的整个结构都会被封装到CLass对象中

得到Class类的几种方式
重点:
一个加载的类在 JVM 中只会有一个Class示例
每个类的实例都会记得自己是由哪个Class实例所生成
Class类是Reflection的根源, 针对任何你想动态加载,运行的类 ,
唯有先获得相应的Class对象

所有类型的Class对象
只要元素类型与维度一样 就是同一个Class
int [] a=new int[10];
int [] b=new int[100];
System.out.println(a.getClass().hashCode());
System.out.println(b.getClass().hashCode());

Java类内存分析

加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象.

类的加载过程
重点 类的加载过程

类加载步骤解释:
1 先加载到内存堆里面 会产生一个类对应的Class对象
2 再后来 进行链接到 栈区 , 在栈区main方法中结束 会得到m=0
3 再后来 进行初始化方法clinit方法 寻找 A类的对象
如下得到 m值为100 再返回到 栈区中赋值给m

分析类初始化
重点!!!
类的主动引用(一 定会发生类的初始化)
包括以下几类:
当虚拟机启动,先初始化main方法所在的类
new 一个类的对象
调用类的静态成员(除了final常量)和静态方法
使用java.lang.reflect包的方法对类进行反射调用
当初始化 一个类,如果其父类没有被初始化,则先会初始化它的父类
类的被动引用(不会发生类的初始化)
包括以下几类:
当访问一个静态城时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化
通过数组定义类引用,不会触发此类的初始化
引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)

产生类的引用的方法的输出结果为下面的第二张图
而不会产生类的引用的方法的输出结果 我放在了图中的注释中!!!

类加载器(面试会问)

创建运行时类的对象
获取类的运行时结构

通过反射 Class对象来获取它的包名和类名

有了Class对象 能做什么
动态的创建对象 通过反射

性能对比分析

所以可以看出 如果反射调用比较多的时候可以关闭这个检测
获取泛型信息
generic 泛型
Paramnter 参数

获取注解信息

总结
首先讲解 注解

接下来讲解反射机制


再接下来

本文详细解析了Java中注解与反射的重要性,涉及内置注解如@Deprecated和@Override,自定义注解的创建,以及如何通过反射机制动态获取类信息并操作对象。讨论了动态语言与静态语言的区别,以及Java如何利用反射实现类似动态语言的特性。
997

被折叠的 条评论
为什么被折叠?



