注解和反射
注解
一、什么是注解
1、不是程序本身,可以对程序做出解释(这一点和注释没什么区别)
2、可以被其他程序(比如:编译器等)读取 (通过反射读取)
二、注解的格式
注解是以"@注释名"再代码中存在的,还可以添加一些参数值
三、在哪使用
可以附加再package,class,method,field等上面
四、为什么要使用注解,以及注解存在的缺点
以Spring为例,早期版本的Spring是通过XML文件的形式对整个框架进行配置的,优点呢就是整个项目的配置信息集中在一个文件中,从而方便管理,是集中式的配置。缺点也显而易见,当配置信息非常多的时候,配置文件会变得越来越大不易查看管理,特别是多人协作开发时会导致一定的相互干扰。
现在都提倡解耦、轻量化或者说微小化,那么注解就顺应了这一需求,各个包或模块在内部方法或类上使用注解即可实现指定功能,而且使用起来非常方便,简单易懂。缺点呢就是不方便统一管理,如果需要修改某一类功能,则需要整体搜索逐个修改,是分散式的存在各个角落。
五、注解的分类
1、标准内置注解 – 这些注解是Java SE提供的,用于基本的元数据标记
2、元注解 - 元注解是用于注解其他注解的注解。。
3、自定义注解-开发者可以创建自定义注解。
1、内置注解
内置注解:
@Override:定义在Java.lang.Override中,表示一个方法声明打算重写超类中的另一个方法的声明
@Deprecated:定义在java.lang.Deprecated中 此注释可以用于修饰方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为他很危险或者存在更好的选择
@SuppressWarnings:定义在java.lang.SuppressWarnings中,用于抑制编译时的警告信息
与前两个注释有所不同这个需要添加参数
@SuppressWarnings("all")
@SuppressWarnings("unchecked")
等等
2、元注解
元注解:
@Target(value = ElementType.FIELD )
表示我们的注解可以用到哪些地方 下面就是源码给的枚举
public enum ElementType {
/** 类、接口(包括注解接口)、枚举或记录声明 */
TYPE,
/** 字段声明(包括枚举常量) */
FIELD,
/** 方法声明 */
METHOD,
/** 正式参数声明 */
PARAMETER,
/** 构造方法声明 */
CONSTRUCTOR,
/** 局部变量声明 */
LOCAL_VARIABLE,
/** 注解接口声明(以前称为注解类型) */
ANNOTATION_TYPE,
/** 包声明 */
PACKAGE,
/**
* 类型参数声明
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* 类型使用
*
* @since 1.8
*/
TYPE_USE,
/**
* 模块声明
*
* @since 9
*/
MODULE,
/**
* 记录组件
*
* @jls 8.10.3 记录成员
* @jls 9.7.4 注解可以出现的位置
*
* @since 16
*/
RECORD_COMPONENT;
}
// 表示我们的注解在什么地方还有效
Retention(value=RetentionPolicy.RUNTIME)
// runtime>class>sources (分别是 运行时,编译后,源码)
//表示是否将我们的注解生成在JAVAdoc中
@Documented
//子类可以继承父类的注解
@Inherited
3、自定义注解
使用@interface自定义注解
package cn.kgc.redis.springredis.entity;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author 张航
* @Date 2024/7/1
* @Description
*/
public class a {
//注解可以显视赋值 ,如果没有默认值,就必须给注释赋值
@myad(name = "zhang")
public void test(){
}
}
@Target({ElementType.TYPE,ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@interface myad{
//注解的参数:参数类型+参数名()
String name() default "" ;
int id() default -1 ;//如果默认值为-1,代表不存在
}
反射
一、Java反射机制概述
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期间借助Reflection API取得任何类的内部信息,并且直接操作任意对象的内部属性及其方法
正常方式:引入需要的"包类"名称--》通过new实例化--》取得实例化对象
反射方式:实例化对象--》getClass()方法--》得到完整的"包类"名称
二、理解Class类并获取Class实例
//获取方式
// 一、通过对象获取
person.getClass();
//二、forname获得
Class.forname("");
//三、通过类名.class获得
Student.class;
//其他
//获取基本内置类型的包装类都有一个Type属性
Integer.TYPE;
//获得父类类型
person.getClass().getSuperclass();