【狂神说JAVA】注解和反射【基础巩固】

本文详细介绍了Java中的注解(Annotation)和反射(Reflection)基础,包括注解的概念、元注解及其作用,以及自定义注解的创建。同时,文章探讨了反射的重要性,动态语言与静态语言的区别,并列举了Class类的常用方法,如何通过反射创建运行时类的对象,以及不同方式调用方法的性能测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【狂神说JAVA】注解和反射【基础巩固】

【狂神说Java】注解和反射_哔哩哔哩_bilibili

Java 注解(Annotation) | 菜鸟教程 (runoob.com)

1、注解(java.Annotation)

1.1 概念

​ 注解和注释一样,注解不是程序本身,而是对程序作出解释,而注解与注释不同的点在于,注解可以被其他程序比如编译器读取。

内置的注解

Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。

作用在代码的注解是

  • @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
  • @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
  • @SuppressWarnings - 指示编译器去忽略注解中声明的警告。

作用在其他注解的注解(或者说 元注解)是:

  • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
  • @Documented - 标记这些注解是否包含在用户文档中。
  • @Target - 标记这个注解应该是哪种 Java 成员。
  • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

从 Java 7 开始,额外添加了 3 个注解:

  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
  • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

测试

package test;

public class Test extends Object{
   
    @Override //重写
    public String toString() {
   
        return super.toString();
    }

    @Deprecated //已被弃用 
    public void showName(){
   
        System.out.println("张三");
    }
}

在这里插入图片描述

1.2 元注解

1、 元注解的作用

元注解的作用:解释注解其他注解

Java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型做说明

4个元注解分别为:

  • @Target:用于描述注解的使用范围

  • @Retention:用于表示需要在什么级别保存注解信息,用于描述注解的声明周期,

    • (SOURCE<CLASS<RUNTIME(常用))
  • @Document:说明该注解将被包含在javadoc中

  • @Inherited:说明子类可以继承父类中的该注解

/*
 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
 * ....
 */

package java.lang;

import java.lang.annotation.*;

// ...

@Target(ElementType.METHOD) //用于描述注解的使用范围
@Retention(RetentionPolicy.SOURCE) //用于表示需要在什么级别保存注解信息,用于描述注解的声明周期
public @interface Override {
   
}

1.3 自定义注解

package test;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;

public class Test02 {
   
    
    @MyAnnotation02(cname = "张三",school = "清华大学")
    @MyAnnotation03("2022")
    public void test02(){
   }
    
}

@Target({
   METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation02 {
   
    //注解的参数,并定义默认值
    String cname() default "";
    int cage() default 0;
    int cid() default -1;
    String school();
}

@Target({
   METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation03 {
   
    //value()可不用写测试名称
    String value();
}

2、反射概述(java.Reflection)

2.1 动态语言和静态语言

  • 动态语言:

    ​ 在运行时可以改变其结构:例如新的函数、对象甚至代码可以被引进,已有的函数可以被删除或者是其他结构上的变化。通俗来说就是运行时代码可以根据一些条件来改变自身的结构。主要动态语言:Object-C、C#、JavaScript、PHP、Python等。

  • 静态语言:

    ​ 与动态语言相对应的,运行时不能改变其结构,如Java、C、C++。Java不是动态语言,但是java可以称为是“准动态语言”。即java有一定的动态性,可以利用反射机制获得类似动态语言的特性。Java的动态性使得编程时更加灵活。

在这里插入图片描述

反射 (java.Reflection)应用:

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

​ 加载完类之后,在堆内存中的方法区中间产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。

1、定义实体类

package ReflectionTest;

public class User{
   
    Integer id;
    String name;
    Integer age;

    public User() {
   
    }

    public User(Integer id, String name, Integer age) {
   
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
   
        return id;
    }

    public void setId(Integer id) {
   
        this.id = id;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值