跟着老侯玩编程 跟着老侯玩编程
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
  • 基础篇

    • 聊聊环境变量
    • 永不过时的HelloWorld
    • 标识符
    • 数据类型
    • 运算符
    • 语句
    • 数组
    • 方法详解
    • 类和对象
    • 类的成员
    • 类的继承
    • 类的形式
    • 封装和多态
    • 接口和Lambda表达式
    • 泛型编程
    • 常用API之函数式接口
    • 常用API
    • 异常机制
    • 多线程
    • 常用API之File类
    • IO流
    • 集合
    • 常用API之Stream流
    • 网络编程
    • 枚举
    • 注解和反射
      • 注解
      • 内置注解
      • 自定义注解
      • 元注解
        • @Target
        • @Retention
        • @Documented
        • @Inherited
      • 反射
      • Class类
      • 案例-反射绕过泛型检查
  • 进阶篇

    • MySQL基础
    • 数据库-JDBC
    • HTML基础
    • CSS基础
    • JavaScript-基础
    • 服务器-Servlet
    • 服务器-Servlet3
    • 动态网页-JSP
    • Ajax
    • 前端项目工程化
    • ECMA2015
    • 模块化规范
  • 框架篇

    • 工具-Maven
    • 框架-MyBatis
    • 框架-Spring
    • 框架-SpringMVC
    • 工具-SpringBoot
    • 工具-Nginx
  • Java
  • 基础篇
舞动的代码
2022-05-17
目录

注解和反射

# 注解

Annotation是从JDK5.0开始引入的新技术

Annotation的作用:

  • 不是程序本身,可以对程序作出解释。(这一点,跟注释没什么区别)

  • 可以被其他程序(比如:编译器等)读取。(注解信息处理流程,是注解和注释的重大区别。如果没有注解信息处理流程,则注解毫无意义)

Annotation的格式:

  • 注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")。

Annotation在哪里使用?

  • 可以附加在package, class, method, field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。

# 内置注解

@Override

  • 定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。

@Deprecated

  • 定义在java.lang.Deprecated中,此注释可用于修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。

@SuppressWarnings

  • 定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息

  • 与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,参数如下:

备注:

  • @SuppressWarnings("unchecked")
  • @SuppressWarnings(value={"unchecked", "deprecation"})

# 自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口

要点:

  • @interface用来声明一个注解

格式为:

  • public @interface 注解名 {定义体}
  • 其中的每一个方法实际上是声明了一个配置参数。
  • 方法的名称就是参数的名称
  • 返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)
  • 可以通过default来声明参数的默认值。
  • 如果只有一个参数成员,一般参数名为value

注意:注解元素必须要有值。我们定义注解元素时,经常使用空字符串、0作为默认值。也经常使用负数(比如:-1)表示不存在的含义

# 元注解

元注解的作用就是负责注解其他注解。 Java定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。

这些类型和它们所支持的类在java.lang.annotation包中可以找到

# @Target

用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

注意

  • @Target(value=ElementType.TYPE)

# @Retention

表示需要在什么级别保存该注释信息,用于描述注解的生命周期(被描述的注解在它所修饰的类中可以被保留到何时)

# @Documented

@Documented描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。

@Documented是一个标记注解,没有成员。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField";
    public boolean defaultDBValue() default false;
}
1
2
3
4
5
6
7
8
9

生成doc文档的命令:javadoc -d 存放文档的目录 含有@Documented注解的Java文件

# @Inherited

类继承关系中,子类会继承父类使用的注解中被@Inherited修饰的注解

接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰

类实现接口时不会继承任何接口中定义的注解


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface IsInheritedAnnotation {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface NoInherritedAnnotation {
}

@NoInherritedAnnotation
@IsInheritedAnnotation
public class InheritedBase {
}

public class MyInheritedClass extends InheritedBase  {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 反射

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制

反射就是把 Java 类中的各种成分映射成一个个的 Java 对象

# Class类

获取Class对象的方式

  1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象。 多用于配置文件,将类名定义在配置文件中。读取文件,加载类

  2. 类名.class:通过类名的属性class获取。多用于参数的传递

  3. 对象.getClass():getClass()方法在Object类中定义着。多用于对象的获取字节码的方式

常用API

方法名 说明
forName() (1) 获取 Class 对象的一个引用,但引用的类还没有加载(该类的第一个对象没有生成)就加载了这个类。(2) 为了产生 Class 引用,forName() 立即就进行了初始化。
Object-getClass() 获取 Class 对象的一个引用,返回表示该对象的实际类型的 Class 引用。
getName() 取全限定的类名(包括包名),即类的完整名字。
getSimpleName() 获取类名(不包括包名)
getCanonicalName() 获取全限定的类名(包括包名)
isInterface() 判断 Class 对象是否是表示一个接口
getInterfaces() 返回 Class 对象数组,表示 Class 对象所引用的类所实现的所有接口。
getSupercalss() 返回 Class 对象,表示 Class 对象所引用的类所继承的直接基类。应用该方法可在运行时发现一个对象完整的继承结构。
newInstance() 返回一个 Oject 对象,是实现“虚拟构造器”的一种途径。使用该方法创建的类,必须带有无参的构造器。
getFields() 获得某个类的所有的公共(public)的字段,包括继承自父类的所有公共字段。 类似的还有 getMethods 和 getConstructors。
getDeclaredFields 获得某个类的自己声明的字段,即包括 public、private 和 proteced,默认但是不包括父类声明的任何字段。类似的还有 getDeclaredMethods 和 getDeclaredConstructors。

# 案例-反射绕过泛型检查

枚举
MySQL基础

← 枚举 MySQL基础→

Theme by Vdoing | Copyright © 2013-2023 冀ICP备16006233号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×