java自定义注解的实现

        今天研究了一下注解这个玩意,其实我们一直都在使用注解,一般我们都是用的第三方提供的注解或者是java内置的注解,我们从来没有关注过这些注解是怎么来的。像我们最开始接触java时,会碰到@Override注解,@SuppressWarnings注解,这些注解是java内置的注解,还有平时我们使用框架,接触到的第三方注解,如:@Service注解,@Controiller注解,@Components注解等等,这些都是Spring框架提供的注解。既然Spring框架可以提供自己的注解,那么我们肯定也是可以自定义自己的注解的,下面,我们就来聊一聊如何定义自己的注解吧。

什么是注解?

        首先,我们先来聊一聊什么是注解。注解的作用的放在类,方法或者属性上,用来描述被修饰对象的。它仅仅是描述,并不影响被修饰对象本身。可以理解为他只是一个标签而已,我们可以根据这个标签来找到被这个标签修饰的对象,就像我们身为学生,有自己的学号,上班的话会有自己的工号,家里的房子会有自己的门牌号等等,这些可以理解为是注解,他们只是被修饰对象的附带标签,并不影响被修饰对象本身。虽然举得例子不是很恰当,但是很好理解吧,反正我是这样理解的,哈哈哈哈!!

为什么要用注解?

        其实注解这个玩意是在java1.5之后推出的一种新的应用类型,在它推出之前,我们知道我们在使用Spring框架是,想要将对象交给Spring来管理,需要将对象通过配置bean的方式将类一一配置在xml文件中,这就导致了,假如我的类十分的多的时候就需要配置很多次,十分繁琐,后来注解的出现,大大提供了代码的开发效率。我们现在使用Spring框架在进行控制反转时只需要在想要让Spring框架管理的类上打上注解,就ok了,最后要在配置文件中配置注解扫描器来扫描这些注解。是不是很方便。

如何自定义注解?

        我们如何来自定义自己的注解呢?java为我们提供了自定义注解的方式?我们自定义注解的写法如下:

@Target(value=ElementType.METHOD)
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	String value() default "";
}

这是我自己定义的一个注解@MyAnnotation ,乍一看这个结构和接口的定义很类似,用到了interface关键字,但是区别是在interface关键字前,要加一个‘@‘符号,然后下边是注解的自定义属性,注意,这里的属性定时,不是像类属性定义一样。这里的属性定义是通过方法来实现的,后边的default关键字可以为属性设置默认值。另外,实现子定义注解还要为我们自己的注解加上两个元注解。@Target和@Retention,这两个注解是必须加的。@Target注解指定了我们自定义注解的修饰范围,是修饰类,还是方法,还是属性,@Retention注解指定了我们的自定义注解在什么情况下有效。他们的可选值有很多。这里不再一一叙述。个人推荐看看看这边博客
        这是链接 https://blog.youkuaiyun.com/andyzhu_2005/article/details/81355399
        按照以上的代码格式就可以自定义出一个我们自己的注解了.

自定义注解的使用和解析

        我们定义好了自己的注解,那么我们如何来使用呢?很简单,想在使用注解直接在那个打上注解就可以了。
        接下来,我们来说一下注解的解析,我们在打上注解之后,我们要知道,我们用这个注解来干什么用?我们可以来解析这个注解,下面我就来对我自定义的这个注解来解析。先上代码:

		// 1.获取字节码对象(入口)
		Class<?> cls = User.class;
		// 2.获取方法上的注解
		Method method;
		method = cls.getDeclaredMethod("toString");
		String value = method.getAnnotation(MyAnnotation.class).value();
		System.out.println(value);
		if (value.equals("toString")) {
			System.out.println(u.toString());
		} else {
			System.out.println("注解为空,不能执行toString方法");
		}

        我们通过反射来获取我的自定义注解,我自定义的注解是修饰在方法上的。
        首先:获取被修饰类的字节码对象,
        然后:通过字节码对象的getDeclaredMethod方法获取到指定的方法。
        接着:通过获取到的方法到的getAnnotation方法获取到方法上的注解。这个方法需要传入一个参数,就是自定义注解的字节码对象。
        最后:可以直接同过调用自定义注解中的方法的方式来获取注解上对应的值。
        这样我们就获取到了注解和注解上的属性值。
        具体我们用这些来干什么,其实很简单,看代码就知道了。
在这里插入图片描述
        我自定义了一个User类,并重写toString方法;而且还在上面加了我自己的自定义注解@MyAnnotation注解。
在这里插入图片描述
        这里我在main方法中解析获取到了我的注解和注解上的属性,我通过判断注解上的属性来执行toString方法输出User对象。如果注解上的属性值不是我设置属性值就输出:注解为空,不能执行toString方法,如果不为空且等于我自己设置的属性,就实行toString方法并输出User对象。
        这只是一个简单的小demo,应用到功能上,就如我文章中间部分推荐的博客。博主自定义了一个权限注解,通过注解来判断用户是否有权限登入系统。等等,注解的应用其实很灵活,关键看自己怎么来用。

### Java 自定义注解实现方法与示例 #### 创建自定义注解Java 中,可以通过 `@interface` 关键字来声明一个新的注解。以下是创建自定义注解的关键要素: 1. **定义注解名称** 使用 `@interface` 定义新的注解类型。 2. **设置属性(可选)** 可以为注解添加属性,这些属性类似于方法签名,但不带具体实现。 3. **指定目标和保留策略** 需要通过元注解 `@Target` 和 `@Retention` 来限定注解的作用范围以及生命周期。 下面是一个简单的自定义注解示例[^4]: ```java 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 MyAnnotation { String value() default ""; // 默认值为空字符串 int count() default 0; // 默认计数值为0 } ``` --- #### 使用自定义注解 一旦定义好注解,就可以将其应用到类、方法或其他允许的地方。以下是如何使用上述 `@MyAnnotation` 的例子[^1]: ```java class MyClass { @MyAnnotation(value = "This is a sample method", count = 5) public void myMethod() { System.out.println("Method executed"); } } ``` 在这里,`myMethod()` 被标记了一个带有参数的 `@MyAnnotation` 注解。 --- #### 获取注解并读取其值 为了利用注解中的信息,通常会结合反射机制动态解析它们。以下是从类中提取注解信息的一个完整示例[^2]: ```java import java.lang.reflect.Method; public class AnnotationMain { public static void main(String[] args) throws Exception { MyClass obj = new MyClass(); // 获取当前对象的Class实例 Class<?> cls = obj.getClass(); // 查找所有的Declared Methods Method[] methods = cls.getDeclaredMethods(); for (Method method : methods) { // 判断该方法是否有特定注解 if (method.isAnnotationPresent(MyAnnotation.class)) { MyAnnotation annotation = method.getAnnotation(MyAnnotation.class); // 输出注解中的value和count字段 String value = annotation.value(); int count = annotation.count(); System.out.println("Value: " + value + ", Count: " + count); } } } } ``` 当执行此代码时,它将打印出如下内容: ``` Value: This is a sample method, Count: 5 ``` --- #### 总结 以上展示了完整的流程:从定义自定义注解到实际运用再到通过反射获取其中的信息。这种技术非常适用于框架设计或自动化处理场景下,能够显著减少重复劳动并提升灵活性[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值