纲要
Java_注解入门介绍
一.注解的长什么样
打个比方,在类或方法上上有这么个东西@Override
二.注解的概念
概念:说明程序的,给计算机看的
注意:
1)JDK1.5之后的新特性
2)说明程序的作用
3)使用注解:@注解名称
4)要和注释相区分,注释是给程序员看的
三.注解的作用
①编写文档
②代码分析
③编译检查
四.JDK中自带的一些注解
@Override
作用:检测被该注解标注的方法是不是继承自父类(接口)的
@Deprecated
作用:告诉计算机,这段代码已经过时
@SuppressWarnings
作用:压制警告,消除所有警告
注意:一般传递参数“all”
比如: @SuppressWarnings(“all”)
五.自定义注解
格式
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
元注解
public @interface Override {
}
本质
public interface MyAnno extends java.lang.annotation.Annotation {
}
注解本质就是一个接口,该接口默认继承Annotation接口
属性
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro
{
String className();
String methodName();
}
说的直白一点,其实是里面的方法,属于叫做属性。
要求
1.属性的返回值类型只允许是如下的几类
①基本数据类型
②String
③枚举
④注解
⑤以上类型的数组
2.定义的属性,使用时需要给属性赋值,如下代码:
@Pro(className = "cn.itcast.annotation.Demo1",methodName = "show")
public class ReflectTest
{
几种特殊状况:
①如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性赋值。
②如果只有一个属性要赋值,并且属性的名称是value,则value可以省略,直接定义即可
③数组赋值时,要用大括号赋值(只有一个值得话,大括号可以省略)
元注解
概念:用于描述注解的注解
@Target
作用:描述注解作用的位置
参数:ElemenType取值
TYPE:可以作用在类上
METHOD:可以作用在方法上
FIELD:可以作用在成员变量上
@Retention
作用:描述注解被保留的阶段
举例
*@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
@Document
作用:描述注解是否被抽取到api文档中
@Inherited
作用:描述注解是否可以被子类继承
六.如何在程序中使用注解
功能一:获取注解中定义的属性值
下面展示一些 直接上代码:
。
@Pro(className = "cn.itcast.annotation.Demo1",methodName = "show")
public class ReflectTest
{
public static void main(String[] args) throws Exception
{
//可以创建任意类的对象,执行任意方法
/*
* 前提:不改变该类的任何代码,可以创建任意类的对象,可以执行任意方法
* */
//1.解析注解
//1.1获取该类的字节码文件对象
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//2.获取上边的注解对象
/*
* public class ProImpl implements Pro
* {
* public String className()
* {
* return "cn.itcast.annotation.Demo1";
* }
* public String methodName()
* {
* return "show";
* }
* */
//其实就是在内存中生成了一个该注解接口的子类实现对象
Pro an = reflectTestClass.getAnnotation(Pro.class);
//3.调用注解对象中定义的抽象方法,获取返回值
String className = an.className();
String methodName = an.methodName();
System.out.println(className);
System.out.println(methodName);
//3.加载该类进内存
Class cls = Class.forName(className); //返回一个cls对象
//4.创建对象
Object obj = cls.newInstance();
//5.获取方法对象
Method method = cls.getMethod(methodName);
//6.执行方法
method.invoke(obj);
}
}
步骤:
1.获取注解定义位置的对象(Class)
2.获取指定的注解
- getAnnotation(Class)
- 其实内部代码就是如下这样的
public class ProImpl implements Pro
{
public String className()
{
return "cn.itcast.annotation.Demo1";
}
public String methodName()
{
return "show";
}
//其实就是在内存中生成了一个该注解接口的子类实现对象
3.调用注解中的抽象方法获取配置的属性