AI智能
改变未来

java进阶(42)–注解

文档目录:

一、概念

二、注解的使用方法

三、JDK内置注解

四、元注释

五、注解中定义属性

六、反射注解的对象

七、反射注解对象的属性值

—————————————分割线:正文——————————————————–

一、概念

1、注解即注释:Annotation

2、引用数据类型,编译之后包生成xxx.class文件

3、自定义注解:语法[修饰符列表]@interface 注解类型名{}

二、注解的使用方法

1、注解使用时语法格式:@注解类型名

2、注解可以出现在类、属性、方法、变量等几乎任意类型上

三、JDK内置注解

1、@Deprecated注解

表示注解的元素已过时,有更好的解决方案

2、@Override注解

只能注解方法,给编译器参考的,如果不是重写父类方法时编译器会报错

@Overridepublic String toString() {return \"AnnotationTest01{\" +\"no=\" + no +\'}\';}

四、元注释

注解注解的注解

@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {}

1、@Target注解

用来标注的注解可以出现在哪些位置上

2、@Retention注解

表示该注解被保存的位置

五、注解中定义属性

1、如果一个注解中有属性,那必须给属性赋值,除非属性有defalut默认值

注解:

package com.bk.java.Test42;public @interface MyAnnotation {String name();int no() default 1;}

测试程序:

package com.bk.java.Test42;public class AnnotationTest01 {@MyAnnotation(name=\"test01\")private int no;public static void m1(){int i=100;}public AnnotationTest01(){}public String toString() {return \"AnnotationTest01{\" +\"no=\" + no +\'}\';}}

2、如果属性值是value且只有一个属性时,使用时可以省略。

注解:

package com.bk.java.Test42;public @interface MyAnnotation {String value();}

测试程序:

package com.bk.java.Test42;public class AnnotationTest01 {@MyAnnotation(\"testvalue01\")private int no;@MyAnnotation(value = \"testvalue02\")public static void m1(){int i=100;}public AnnotationTest01(){}}

3、注解的属性类型为数组

注解中可以使用的类型为:

byte、short、int、long、float、double、boolean、char、String、Class以及每一种的数组形式

注解:

package com.bk.java.Test42;public @interface MyAnnotation {String value();}

测试程序:当数组只有一个类型时,大括号可以省略

package com.bk.java.Test42;public class OtherAnnotationTest01 {@OtherAnnotation(age = 10,email = {\"[email protected]\",\"[email protected]\"})public void doSome(){}@OtherAnnotation(age=25,email = \"[email protected]\")public void doOther(){}}

六、反射注解的属性值

注解:

package com.bk.java.Test42;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface MyAnnotation02 {String Value() default \"北京\";}

注解测试:

package com.bk.java.Test42;@MyAnnotation02public class MyAnnotationTest02 {int i;public MyAnnotationTest02(){}@MyAnnotation02public void  doSome(){int i;}}

测试反射注解:

package com.bk.java.Test42;public class ReflectAnnotationTest02 {public static void main(String[] args) throws ClassNotFoundException {//获取类Class c= Class.forName(\"com.bk.java.Test42.MyAnnotationTest02\");//判断是否此类是否有注解对象if(c.isAnnotationPresent(MyAnnotation02.class)){MyAnnotation02 myAnnotation02=(MyAnnotation02)c.getAnnotation(MyAnnotation02.class);System.out.println(\"类上的注解对象\"+myAnnotation02);//获取注解对象的属性String value=myAnnotation02.Value();System.out.println(value);}}}

查看代码运行结果:

类上的注解对象@com.bk.java.Test42.MyAnnotation02(Value=北京)北京

七、反射方法上的注解信息

注解:

package com.bk.java.Test42;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface MyAnnotation03 {String username();String password();}

注解测试:

package com.bk.java.Test42;import java.lang.reflect.Method;public class MyAnnotationTest03 {@MyAnnotation03(username=\"admin\",password = \"123\")public void doSome(){};public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {Class c=Class.forName(\"com.bk.java.Test42.MyAnnotationTest03\");//获取doSome方法Method doSomeMethod=c.getDeclaredMethod(\"doSome\");//判断方法上是否有这个注解if(doSomeMethod.isAnnotationPresent(MyAnnotation03.class)){MyAnnotation03 myAnnotation03=doSomeMethod.getAnnotation(MyAnnotation03.class);System.out.println(myAnnotation03.username());System.out.println(myAnnotation03.password());}}}

查看运行结果:

admin123

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » java进阶(42)–注解