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);
}
}