注解和反射

注解和反射

注解

一、什么是注解
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();
三、类的加载与ClassLoader
四、创建运行时类的对象
五、获取运行时类的完整结构
六、调用运行时类的指定结构
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值