「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
前言:注解和反射是一切框架的底层
本文很多是学习狂神视频时做的笔记,感谢狂神,也有加入了自己的理解和思考,希望作为一个整理,也能对大家有所帮助。
注解(java.Annotation)
什么是注解
1.不是程序本身,可以对程序作出解释
2.可以被其他程序(如编译器等)读取
内置注解
@Override 重写
@Deprecated 指这段代码过时了
@SuppressWarning(“all”) 抑制编译时候的警告信息,需要一个参数
元注解
@Target
1 | less复制代码class learn extends Object{ |
例如lombol的源码中标记了运行时才有效果。
Retention 美[rɪˈtenʃn] n.保持 维持;
Retention默认RUNTIME
自定义注解
1 | less复制代码class Person{ |
反射机制(java.Reflection)
Java是静态语言,因为有了反射机制变成了动态语言
反射:即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。
静态语言和动态语言
- 动态语言
是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。
主要动态语言:Object-C、JavaScript、PHP、Python、Erlang。
- 静态语言
与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++、C#。
PS:C#不是动态语言,但是MS有将.NET支持动态语言的趋势,3.0吸收了一定动态特征,比如 匿名函数,临时类型,临时变量等
动态语言示例:
1 | ini复制代码function Person(name){ |
Java反射机制概述
Demo
1 | typescript复制代码package com.company; |
输出
1 | vbnet复制代码class com.company.Person |
理解Class类并获取Class实例
1 | csharp复制代码package com.company; |
类的加载原理与ClassLoader
1 | csharp复制代码public class learn3 { |
- 加载到内存,会产生一个类对应Class对象
- 链接,链接结束后m=0
- 初始化
1 | ini复制代码<clinit>(){ |
分析类初始化
子类没有被加载
因为在链接阶段就已经设置类变量默认初始值了
常量在链接阶段就存入调用类的常量池中了
类加载器的作用(了解)
获取运行时类的结构
有了Class对象,能做什么
动态创建对象
- 直接用字节码文件获取对应实例
1 | ini复制代码// 调用无参构造器 ,若是没有,则会报异常 |
- 有带参数的构造函数的类,先获取到其构造对象,再通过该构造方法类获取实例:
1 | arduino复制代码//获取构造函数类的对象 |
调用指定方法
Demo
1 | csharp复制代码public class Calculator{ |
获取属性值
1 | csharp复制代码package com.company.myp1; |
性能对比分析
反射操作范型
反射操作注解
练习Demo,生成sql语句
1 | java复制代码package com.company.com.learn1; |
输出:
1 | ini复制代码@com.company.com.learn1.TableName(value=db_student) |
本文转载自: 掘金