🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 解释 1. 自定义注解的作用:在反射中获取注解,以取得注解修饰的“类、方法、属性”的相关解释。 2. java内置注解 ~~~ @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: ElemenetType.CONSTRUCTOR 构造器声明 ElemenetType.FIELD 域声明(包括 enum 实例) ElemenetType.LOCAL_VARIABLE 局部变量声明 ElemenetType.METHOD 方法声明 ElemenetType.PACKAGE 包声明 ElemenetType.PARAMETER 参数声明 ElemenetType.TYPE 类,接口(包括注解类型)或enum声明 @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括: RetentionPolicy.SOURCE 注解将被编译器丢弃 RetentionPolicy.CLASS 注解在class文件中可用,但会被JVM丢弃 RetentionPolicy.RUNTIME JVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。 ~~~ # 实现 ## 定义自定义注解 ~~~ package com.annotation; import org.springframework.stereotype.Component; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ ElementType.TYPE })//注解用在类上 @Retention(RetentionPolicy.RUNTIME)//VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息 @Component public @interface RpcService { String value(); } ~~~ ## 使用类 接口 ~~~ package com.service; public interface HelloService { String hello(String name); } ~~~ 实现类 ~~~ package com.service.impl; import com.annotation.RpcService; import com.service.HelloService; @RpcService("HelloService") public class HelloServiceImpl implements HelloService { @Override public String hello(String name) { return "hello "+name; } public void test() { System.out.println("test"); } } ~~~ ## spring配置文件 component扫描 ~~~ <context:component-scan base-package="com" /> ~~~ ## 通过ApplicationContext获取所有标记这个注解的类 ~~~ @Component public class MyServer implements ApplicationContextAware { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { //获取使用这个注解的类 Map<String, Object> serviceBeanMap = applicationContext.getBeansWithAnnotation(RpcService.class); for (Object serviceBean : serviceBeanMap.values()) { try{ //获取自定义注解上的value String value = serviceBean.getClass().getAnnotation(RpcService.class).value(); System.out.println("注解上的value: "+value); //反射被注解类,并调用指定方法 Method method = serviceBean.getClass().getMethod("hello", String.class); Object invoke = method.invoke(serviceBean, "jdxia"); System.out.println(invoke); }catch (Exception e) { e.printStackTrace(); } } } } ~~~