详解java注解相关知识
作者:红旗下的小兵 发布时间:2022-09-22 12:32:52
标签:java,注解
定义
1、如果注解中有属性,那么必须给属性赋值。
package com.lxc.Test;
// 定义一个注解
public @interface Annotation {
String name(); // 看似name像一个方法,实际上我们把name称为属性
}
使用上边注解:
package com.lxc.Test;
public class Test {
@Annotation(name="lxc")
public void test() {
}
}
2、如果注解中有属性,且没有定义默认值,那么在使用注解的时候,必须给属性赋值。
public @interface Annotation {
String name();
int age();
}
public class Test {
@Annotation(name="lxc", age=20)
public void test() {
}
}
但是注解中如果有默认值,在使用注解时,可以不给属性赋值
public class Test {
@Annotation(name="lxc")
public void test() {
}
}
public @interface Annotation {
String name();
String password() default "123";
}
3、value() 属性
如果注解中的一个属性名是value,且有且只有一个value(),在使用注解的时候,属性名可以省略
public class Test {
@Annotation("lxc")
public void test() {
}
}
public @interface Annotation {
String value();
String password() default "123";
}
注解中属性的类型有哪些
byte、short、int、float、double、boolean、char、String、Class、枚举
数组:
如果数组属性中有一个元素,那么数组的大括号可以省略:
public @interface Annotation {
String[] name();
}
public class Test {
// @Annotation(name={"lxc"}) // 写法一
@Annotation(name="lxc") // 写法二
public void test() {
}
}
枚举:
public enum MyEnum {
className, name, age,
}
public @interface Annotation {
String[] name();
MyEnum[] student();
}
public class Test {
@Annotation(name="lxc", student = {MyEnum.className, MyEnum.age})
public void test() {
}
}
注解如何使用:
(1)标记一个注解只能出现在类或者方法上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
public @interface Annotation {
String userName();
MyEnum[] student();
}
(2)标记一个注解可以被反射机制所读取
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 标记注解只能出现在类上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 标记注解可以被反射机制所读取
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
String userName();
MyEnum[] student();
}
获取注解中的属性值
通过反射机制来获取。
(1)获取类上边注解的属性:
注解类:
package com.lxc.Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 标记注解只能出现在类上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 标记注解可以被反射机制所读取
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
String userName() default "吕星辰";
}
使用注解类:
// myAnnotation
@Annotation(userName = "哈哈")
public class myAnnotation {
}
获取注解类中 的属性:
package com.lxc.Test;
/**
* c.isAnnotationPresent(注解类.class) : 判断一个类上是否有注解,返回true、false
* c.getAnnotation(注解类.class) : 获取注解类的实例
*
*/
public class Test {
public static void main(String[] args) throws Exception{
Class c = Class.forName("com.lxc.Test.myAnnotation");
System.out.println(c.isAnnotationPresent(Annotation.class));
// 判断一个类是否有:Annotation这个注解
if(c.isAnnotationPresent(Annotation.class)) {
// 获取注解对象
Annotation ann = (Annotation) c.getAnnotation(Annotation.class);
// 通过注解对象获取属性值
System.out.println(ann.userName());
}
}
}
(2)获取类中方法上边注解的属性:
注解类:
package com.lxc.Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 标记注解只能出现在类上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 标记注解可以被反射机制所读取
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
String userName();
String password();
}
在方法上使用注解及获取方法上边的注解:
分析:想获取方法上的注解,首先需要获取该方法,获取该方法的前提,获取该方法的类:
package com.lxc.Test;
import java.lang.reflect.Method;
public class UserAnnotation {
@Annotation(userName = "lxc", password = "123")
public void getUser() {}
public static void main(String[] args) throws Exception{
// 通过反射获取类
Class c = Class.forName("com.lxc.Test.UserAnnotation");
// 通过反射获取类中的方法
Method getUserMethod = c.getDeclaredMethod("getUser");
// 判断方法是否有 Annotation 这个注解
if(getUserMethod.isAnnotationPresent(Annotation.class)) {
Annotation ann = getUserMethod.getAnnotation(Annotation.class);
System.out.println(ann.userName()); // lxc
System.out.println(ann.password()); // 123
}
}
}
来源:https://blog.csdn.net/qq_42778001/article/details/118208246


猜你喜欢
- 一些Java项目中在mybatis与spring整合中有MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接
- 开篇我们还是和原来一样,讲一讲做爬虫的思路以及需要准备的知识吧,高手们请直接忽略。首先我们来缕一缕思绪,想想到底要做什么,列个简单的需求。需
- 1 场景调用多个平级服务,按照服务优先级返回第一个有效数据。具体case:一个页面可能有很多的弹窗,弹窗之间又有优先级。每次只需要返回第一个
- 具体代码如下所示:private string GetWeekName(DayOfWeek week) { &nb
- 同步代码块基本语句synchronized (任意对象) {操作共享代码}代码示例public class SellTicket imple
- 一、背景介绍:我们在进行数据存储的时候,有时候会加入本地缓存、分布式缓存以及数据库存储 * 的结构,当我们取值的时候经常是像下面这样的流程:1
- 这里设计一个自定义View,继承了ScrollView,实现可以下拉里面的内容,松手后画面弹回,这个自定义的View可以当做ScrollVi
- ProgressDialog 继承自AlertDialog,AlertDialog继承自Dialog,实现DialogInterface接口
- 想要将一个项目导出为jar包,供其它项目使用,在eclipse中可以直接导出该项目为jar包,而 在AS中可以通过修改gradle才处理。接
- 环绕通知:它是spring框架为我们提供的一种可以在代码中手动控制增强部分什么时候执行的方式。问题:当我们配置了环绕通知之后,增强的代码执行
- 简介我们在前面的Android教程中已经提到过这么一件事:Android在启动后会有一个主线程。它不允许任何子线程去改变主UI线程里的内容。
- 简单版/** * 产生4位随机数(0000-9999) * * @return 4位随机数 &nb
- 目录一、定义联合(union)二、初始化联合(union)三、联合体变量的声明四、联合体变量的赋值和使用五、struct和union和区别u
- Java调用cmd命令,并输出显示信息:package com.anxin.cmd.test; import java.io.Buffere
- 电商项目中经常有这样的需求:在商品列表页面中,切换列表的展现形式,一般分为列表形式和表格形式。如京东:本文最终实现的效果:关键词:Recyc
- 执行引擎也只有几个概念, JVM方法调用和执行的基础数据结构是 栈帧, 是内存区域中 虚拟机栈中的栈元素, 每一个方法的执行就对应着一个栈帧
- 代理模式代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问
- 最新对文件的操作比较频繁。这里记录一下常用的几种文件读写的方式。我这里使用窗体来做测试。1:二进制读写/// <summary>
- 本文实例为大家分享了java实现超市管理系统的具体代码,供大家参考,具体内容如下一、使用技术javaSE二、实现功能超市管理系统具体要求如下
- 一、RFC882文档简单说明RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮