主要知识点
Annotation思维导图.pngAnnotation和class interface等java关键字一样,提供注解的定义,所有自定义注解都默认继承Annotation,就像所有类都默认继承Object一样。
一个简单测试例
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Hello
{
/**
* 注解方法,无方法体,无异常,相当于注解的一个配置参数,参数名就是方法名
*/
String hello() default "";
}
@Hello(hello="hello world!")
public class HelloWorld
{
public static void main(final String[] args)
{
Annotation annotation = HelloWorld.class.getAnnotation(Hello.class);
System.out.println(annotation.annotationType());
if(annotation instanceof Hello)
{
Hello hello = (Hello)annotation;
System.out.println(hello.hello());
}
}
}
运行结果:
interface com.rockie.annotation.test.Hello
hello world!
注解在开源框架中的应用
注解本身无法主动提供任何能力,必须要通过调用者或解析框架来解析以后,根据注解来控制程序行为。注解在框架中的应用非常广泛,如下举例说明。
- spring注解:后面解读spring源码会专门介绍
- dubbo中的注解:
dubbo可扩展的核心是扩展点机制,通过注解实现。主要注解包括@SPI @Adaptive等。
后面补充源码说明... - 工作中一个大数据分析存储框架的使用:
通过自定义注解@TQL,标识自定义算子,实现TQL语句中可以调用java扩展的算法。如下示例所示,虽然没看过源码,但是可以很容易推测出来实现原理。框架服务会加载扩展类,解析类注解,并缓存起来@TQL注解类对应的注解value(parseMac)。sql解析的时候,会根据parseMac获得实际的运算算子,然后构建查询语句执行。
sql: select parseMac(mac) as mac ... from ...
@TQL(value="parseMac")
public class ParseMac
{
}
~~~|
网友评论