当前位置:网站首页>注解。。。
注解。。。
2022-07-07 17:29:00 【Cold Snowflakes】
注解Annotation是一种引用数据类型,编译之后也是生成xxx.class文件。
@Target(value = {
ElementType.METHOD,ElementType.CONSTRUCTOR}) // 指定 可以标注的位置
@Retention(RetentionPolicy.SOURCE) // 表示最终不会编译成 class 文件
@Retention(RetentionPolicy.CLASS) // 最终编译为 class 文件
@Retention(RetentionPolicy.RUNTIME) // 最终编译为 class 文件, 并且可以被反射机制读取
@Deprecated // 标注已过时, 有更好的方案 ( 只是起一个标注信息的作用, 被标注的东西仍然还可以用 )
自定义注解
public @interface MyAnnotation {
/** * 可以在 注解中定义属性 * 看着像个方法, 实际为属性 * @return */
String name();
/** * 颜色属性 */
String color();
/** * 年龄属性 */
int age() default 25; // 指定默认值
}
// 使用注解的时候, 必须给没有设置默认值的属性赋值
@MyAnnotation(name = "xxx",color = "blue")
public class lambdademo {
public static void main(String[] args){
}
}
如果注解中只有一个属性,并且属性名叫 value
的话,则使用该注解的时候,为属性赋值,可以不指定属性名。
如果注解中的某个属性是一个数组类型,且使用该注解,为该属性赋值的时候,大括号里只有一个值,则大括号可以省略。
public @interface Target {
ElementType[] value();
}
// 使用的时候, 大括号里只有一个元素, 大括号可以省略
@Target(ElementType.METHOD) 等同于 @Target({
ElementType.METHOD})
反射提取注解
precondition
@Retention(RetentionPolicy.RUNTIME) // 必须要标注 Runtime, 才可以被反射机制读取
public @interface MyAnnotation {
String name();
String color();
}
Experimental subjects
@MyAnnotation(name = "on type", color = "red")
public class Cat {
@MyAnnotation(name = "on field", color = "blue")
private String name;
private Integer age;
private Integer sex;
}
Extraction by reflection
public static void main(String[] args) throws ClassNotFoundException {
Class<?> cls = Class.forName("com.itheima.Cat");
// 得到类上标注的 MyAnnotation
if(cls.isAnnotationPresent(MyAnnotation.class)){
System.out.println("======标注在类上的======");
MyAnnotation ano = cls.getAnnotation(MyAnnotation.class);
System.out.println(ano);
String color = ano.color(); // 得到 color 属性值
System.out.println(color);
}
// 得到属性上标注的 MyAnnotation
Field[] fields = cls.getDeclaredFields();
for(Field f : fields){
if(f.isAnnotationPresent(MyAnnotation.class)){
System.out.println("======标注在属性上的======");
System.out.println("被标注的属性 " + f.getName());
System.out.println(f.getAnnotation(MyAnnotation.class));
}
}
}
注解有啥用?
对程序的标记,通过反射可以获取到这个标记。
程序可以判断如果【类/方法/属性等等】上面有这个标记信息,就去做什么什么,如果没有,做什么什么。
边栏推荐
猜你喜欢
Numpy——2. Shape of array
2022.07.02
648. 单词替换
Tapdata 的 2.0 版 ,开源的 Live Data Platform 现已发布
【牛客网刷题系列 之 Verilog进阶挑战】~ 多bit MUX同步器
Download from MySQL official website: mysql8 for Linux X Version (Graphic explanation)
Numpy——2.数组的形状
杰理之测试盒配置声道【篇】
Micro service remote debug, nocalhost + rainbow micro service development second bullet
2022.07.05
随机推荐
【HDU】5248-序列变换(贪心+二分)「建议收藏」
CMD command enters MySQL times service name or command error (fool teaching)
Tips and tricks of image segmentation summarized from 39 Kabul competitions
testing and SQA_ Dynamic white box test [easy to understand]
Solve the error reporting problem of rosdep
[Base64 notes] [suggestions collection]
[tpm2.0 principle and Application guide] Chapter 16, 17 and 18
网信办公布《数据出境安全评估办法》,9 月 1 日起施行
How many are there (Lua)
网易云信参与中国信通院《实时音视频服务(RTC)基础能力要求及评估方法》标准编制...
位运算介绍
2022.07.05
杰理之关于 TWS 声道配置【篇】
R语言fpc包的dbscan函数对数据进行密度聚类分析、查看所有样本的聚类标签、table函数计算聚类簇标签与实际标签构成的二维列联表
The top of slashdata developer tool is up to you!!!
POJ 2392 Space Elevator
LeetCode 535(C#)
小试牛刀之NunJucks模板引擎
Longest common prefix (leetcode question 14)
Chief technology officer of Pasqual: analog quantum computing takes the lead in bringing quantum advantages to industry