/** * 注解: * 是一个代码级别的说明,与类和接口平级关系 * JDK中提供的常用注解: * @Override:描述方法的重写 * @SuppressWarnings:压制\忽略警告 * @Deprecated:标记已过时 */
public class Test {
/**
* 注解:
* 是一个代码级别的说明,与类和接口平级关系
* JDK中提供的常用注解:
* @Override:描述方法的重写
* @SuppressWarnings:压制\忽略警告
* @Deprecated:标记已过时
*/
public static void main(String[] args) {
//加上这个注解,忽略黄色的警告
@SuppressWarnings("all")
int i;
Test test = new Test();
test.method();
}
//标记该方法已过时
@Deprecated
public void method(){
}
}
class Fu{
void method1(){};
}
class zi extends Fu{
@Override
void method1() {
super.method1();
}
}
自定义注解:
//定义属性
//属性格式:数据类型 属性名();
/**
* 数据类型只能是一下几种类型:
* 1,基本类型
* 2,String
* 3,Class类型
* 4,注解类型
* 5,枚举类型
* 6,以上类型的一维数组类型
*/
public @interface MyAnnotation {
//定义属性
//属性格式:数据类型 属性名();
/**
* 数据类型只能是一下几种类型:
* 1,基本类型
* 2,String
* 3,Class类型
* 4,注解类型
* 5,枚举类型
* 6,以上类型的一维数组类型
*/
int i();
String name();
boolean b();
Class cls();
}
使用注解
public class Test2 {
/**
* 使用注解:
* 1,没有属性的注解
* 2,有属性的注解
* 给有属性的注解赋值
* @注解名(属性名=属性值,属性名=属性值...)
*/
public static void main(String[] args) {
}
@NAnnotation
public void method1(){
}
@YAnnotation(name = "张三")
public void method2(){
}
}
/** * 使用注解注意事项: * 1,一旦注解有属性了,使用注解的时候,属性必须赋值 * 2,若属性类型是一位数组时,当数组值只有一个时,可以省略{} * 3,如果注解中只有一个属性,并且属性名为value,那么给注解属性赋值的时候,注销属性名value可以省略 * 4,注解属性可以用默认值,格式:属性类型 属性名() defalt 默认值 */
元注解
/** * 元注解:定义在注解上的注解 * @Target 表示注解作用在什么上面,默认注解可以放在任何位置 * ElementType.METHOD 可以作用在方法上 * ElementType.TYPE 可以作用在接口上 * ElementType.FIELD 可以作用在成员变量上 * ElementType.CONSTRUCTOR 可以作用构造方法上 * * @Retention * 定义该注解默认保留在哪个阶段,默认只在源码阶段保留 * * .java文件(SOURCE)-》javac编译-》.class文件(编译阶段,字节码阶段,CLASS)-》运行阶段(RUNTIME) */
注解解析
java.lang.reflect
Interface AnnotatedElement
AnnotatedElement已知实现类如下,所以如果我们的注解如果是加到类上,就通过反射来获取到类,如果注解加到字段上就通过反射获取类的成员变量,如果注解加的方法上就通过反射获取方法。。。。。。
案例
public class Test {
/**
* java.lang.reflect
* AnnotatedElement接口
*
* T getAnnotation(Class<T> annotationClass)
* 返回该元素的,如果这样的注释 ,否则返回null指定类型的注释。参数,传入注解的class对象
*
* default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
* 如果此元素上 存在指定类型的注释,则返回true,否则返回false。
*/
public static void main(String[] args) throws NoSuchMethodException {
//通过反射获取到method1方法
Class<Test> testClass = Test.class;
Method method1 = testClass.getDeclaredMethod("method1");
method1.setAccessible(true);
//传入注解的class对象
MyAnnotation annotation = method1.getAnnotation(MyAnnotation.class);
//获取到注解属性的值
String name = annotation.name();
int age = annotation.age();
//然后根据值执行注解的方法
if("张三".equals(name)){
System.out.println("如果name属性值是张三,那么执行某某方法");
}
if(age==18){
System.out.println("如果age属性值是张三,那么执行某某方法");
}
}
@MyAnnotation(name = "李四",age = 18)
public static void method1(){
System.out.println("执行method1");
}
public static void method2(){
}
}
@Target(ElementType.METHOD)
//保留到运行阶段
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String name() default "张三";
int age();
}