Java 注解

1.注解

package com.wjl.myannotation;

/**
 * 注解javadoc演示
 * 注解(Annotation),也叫元数据,一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举
 * 是在同一个层次。它可以声明包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
 *
 * 概念描述:
 *   1.JDK1.5之后的新特性
 *   2.说明程序的
 *   3.使用注解 @注解名称
 * 作用分类:
 *   1.编写文档:通过代码里标识的注解生产文档【生成文档doc文档】
 *         javadoc -encoding utf-8  AnnoTest.java
 *   2.代码分析:通过代码里标识的注解对代码 进行分析【使用反射】
 *   3.编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
 *
 * JDK中预定义的一些注解:
 *  1.@Override 检测被改中租借标注的方法是否继承自父类(接口)的
 *  2.@Depprecated:该注解标注的内容,表示已过时
 *  3.@SuppressWaring:压制警告
 * @author winsL
 * @version 1.0
 * @since 1.5
 *
 */
@SuppressWarnings("all")
public class AnnoTest {
    /**
     * 计算两个数的和
     * @param a 整数
     * @param b 整数
     * @return  两个数的和
     */
    public int add(int a,int b){
        return a+b;
    }

    @Override
    public String toString() {
        return "注解测试";
    }

    /**
     * 过时,重写
     * 参考printInfo()
     */
    @Deprecated
    public void show(){
        System.out.println("show...");
    }
    public  void printInfo(){
        System.out.println("printInfo...");
    }
}

javadoc -encoding utf-8 AnnoTest.java

在这里插入图片描述

2.自定义注解

自定义注解:
格式:
元注解:
public @interface MyAnno

/**
 * 自定义注解
 */
public @interface MyAnno {
}
编译

javac -encoding utf-8 MyAnno.java

反编译

javap -encoding utf-8 MyAnno.class
Compiled from “MyAnno.java”

public interface MyAnno extends java.lang.annotation.Annotation {
}
本质:注解本质上是一个接口,该接口默认继承java.lang.annotation.Annotation
属性:接口中的抽象方法
     要求:
         1.属性的返回值类型 
             基本类型 String 枚举  注解  前四种的数组
             不可以是类
         2.定义了属性,需要给使用的属性赋值
              1.如果定义属性时,使用default关键字默认初始化值,则使用注解时,可以不进行属性的赋值
              2.如果只有一个属性需要赋值,并且属性的名称时value,则value可以胜利,直接赋值
public enum Person {
    p1,
    p2,
    p3
}
public @interface MyAnno2 {
}
/**
 * 自定义注解
 */
public @interface MyAnno {
    int value();
    //    int show1();
    String show2() default "James";//默认值
    Person per();
    MyAnno2 anno2();
    String[] strs();
}

注解的使用

@MyAnno(value = 100, show2 = "Jack", per = Person.p1, anno2 = @MyAnno2, strs = {"Tom"})
public class Student {
}

3.元注解

用于描述注解的注解
@Target:描述注解能够作用的位置
@Retention:描述注解被保留的阶段
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承

package com.wjl.myannotation;

import java.lang.annotation.*;

/**
 * 元注解:用于描述注解的注解
 *   1.@Target:描述注解能够作用的位置
 *      TYPE 类
 *      METHOD 可以作用域方法上
 *      FIELD
 *   2.@Retention:描述注解被保留的阶段
 *   3.@Documented:描述注解是否被抽取到api文档中
 *   4.@Inherited:描述注解是否被子类继承
 */
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME) //自定义一般runtime
@Documented
@Inherited
public @interface MyInno3 {
}

4.程序中使用自定义注解

public class Boss {
    public void show(){
        System.out.println("Boss show...");
    }
}
public class Employee {
    public  void show(){
        System.out.println("Employee show...");
    }
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 描述需要执行的类名、方法名
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
    String className();
    String methodName();
}
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

@Pro(className = "com.wjl.myannotation.Boss", methodName ="show" )
public class ReflectTest {
    public static void main(String[] args) throws Exception {
        //1.解析注解
        //1.1 获取该类的字节码文件对象
        Class<ReflectTest> reflectTestClass = ReflectTest.class;
        //2.获取上边的注解对象
        Pro annotation = reflectTestClass.getAnnotation(Pro.class);//其实就是在内存中生产了一个该注解接口的子类实现对象
        //3.调用注解对象中定义的抽象方法,获取返回值
        String className = annotation.className();
        String methodName = annotation.methodName();
        System.out.println(className+","+methodName);

        //3.加载该类到内存
        Class cls = Class.forName(className);
        //4.创建对象
        Object obj = cls.newInstance();
        //5.获取方法对象
        Method method = cls.getMethod(methodName);
        //6.执行方法
        method.invoke(obj);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值