文档章节

Java之注解

KuangCaibao
 KuangCaibao
发布于 2015/04/27 11:18
字数 975
阅读 42
收藏 0

JavaWeb的配置信息,以前是使用配置xml文件来做,所以会有很多的配置,这样会很不方便。所以在Servlet3.0后提供了注解的方式来达到配置的目的。

1. 注解定义

注解的使用我们看到很多,形如 @WebServlet(...) 这种。一个注解的定义如下

package test.annotation;

// 这里定义一个 Action 注解
public @interface Action {

}

2. 元注解

元注解就是注解的注解,在注解的定义中,我们还可以对定义的注解进行注解。

package test.anntation;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Action {
}

这里的  @Target , @Retention 就是元注解。

@Retention 注解

    它是被定义在一个注解类的前面,用来说明该注解的生命周期。  它有以下参数:  
        RetentionPolicy.SOURCE :指定注解只保留在一个源文件当中。  
        RetentionPolicy.CLASS :指定注解只保留在一个 class 文件中。  
        RetentionPolicy.RUNTIME :指定注解可以保留在程序运行期间。 

@Target 注解

    它是被定义在一个注解类的前面,用来说明该注解可以被声明在哪些元素前面。 它有以下参数:  
        ElementType.TYPE :说明该注解只能被声明在一个类前。  
        ElementType.FIELD :说明该注解只能被声明在一个类的字段前。  
        ElementType.METHOD :说明该注解只能被声明在一个类的方法前。  
        ElementType.PARAMETER :说明该注解只能被声明在一个方法参数前。  
        ElementType.CONSTRUCTOR :说明该注解只能声明在一个类的构造方法前 。  
        ElementType.LOCAL_VARIABLE :说明该注解只能声明在一个局部变量前。  
        ElementType.ANNOTATION_TYPE :说明该注解只能声明在一个注解类型前 。  
        ElementType.PACKAGE :说明该注解只能声明在一个包名前。  
        如果不加该注解表示可以声明在任何位置  

3. 参考

http://my.oschina.net/aiguozhe/blog/59661

http://blog.csdn.net/jiangwei0910410003/article/details/18501195

4. 测试

4.1 @Override

package test.override;

class A {
	public void print() {
		System.out.println("A");
	}
}

class B extends A {

	public void print() {
		System.out.println("B");
	}
}

public class OverrideTest {

	public static void main(String[] args) {
		
		A a = (A) new B();
		a.print();
	}
}

// output
B

如果在类 B的 print 方法上加上  @Override,表示这个 print 方法是重写父类 A 的 print 方法,如果不加这个的话,如果 B 的意思是重写 A 的方法 print,但是在B的实现中写成了 Print,这时如果没有 @Override 注解,那么程序是不会报错的,如果你粗心的话,这样就发现不了,但是加上了 @Override, 如果检查到 B 中的方法不是重写父类的方法,那么编译通过不了。估计这就是  @Override 的作用了。

4.2 自定义注解使用

// Action.java
package test.annotation;

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)
public @interface Action {

}

// AnnotationTest.java
package test.annotation;

@Action
class ActionAnnotation {
	
}

public class AnnotationTest {

	public static void main(String[] args) {
		System.out.println(ActionAnnotation.class.isAnnotationPresent(Action.class));   // 判断ActionAnnotation这个类是否使用到了 Action 注解
		System.out.println(ActionAnnotation.class.isAnnotation());		
		System.out.println(Action.class.isAnnotation());
	}
}

/*
  // output
  true
  false
  true
*/

代码片段2

// Action.java
package test.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)  // 定义Action注解只能在类的开始
@Retention(RetentionPolicy.RUNTIME) // 载入到JVM中的代码片段,包括注解信息
public @interface Action {
}

// RequestBean.java
package test.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD) // 定义RequestBean注解在方法上
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestBean {

        /*
          注解中再定义注解
        */
	@Target(ElementType.METHOD)
	@Retention(RetentionPolicy.RUNTIME)
	public @interface Get {
		String value();
	}
	
	@Target(ElementType.METHOD)
	@Retention(RetentionPolicy.RUNTIME)
	public @interface Post{
		String value();
	}
}

// AnnotationTest.java
package test.annotation;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@Action
class ActionAnnotation {

	@RequestBean.Get("/hello")
	public void doGetTest(String info) {
		System.out.println("Get: " + info);
	}
	
	@RequestBean.Post("/hello")
	public void doPostTest(String info) {
		System.out.println("Post: " + info);
	}
}

public class AnnotationTest {

	public static void main(String[] args) 
			throws 
			IllegalAccessException, 
			IllegalArgumentException, 
			InvocationTargetException, 
			InstantiationException, 
			ClassNotFoundException {
		
		// 获得ActionAnnotation类的对象实例
		Object obj = Class.forName("test.annotation.ActionAnnotation").newInstance();
		
		// 获得ActionAnnotation类中的方法
		Method[] methods = ActionAnnotation.class.getDeclaredMethods();
		
		// 遍历获得的方法
		for(Method method : methods) {
		        // 如果这个方法上的注解为 RequestBean.Get
			if(method.isAnnotationPresent(RequestBean.Get.class)) {
				String info = method.getAnnotation(RequestBean.Get.class).value();
				
				// 调用该注解标识的方法
				method.invoke(obj, info);
			} else if(method.isAnnotationPresent(RequestBean.Post.class)) {
				String info = method.getAnnotation(RequestBean.Post.class).value();
				method.invoke(obj, info);
			}
		}
	}
}

// output
Post: /hello
Get: /hello

© 著作权归作者所有

上一篇: Java - UML类图
下一篇: java - 泛型
KuangCaibao
粉丝 2
博文 21
码字总数 10699
作品 0
武汉
程序员
私信 提问
spring application 之 AnnotationConfigApplicationContext

创建 AnnotationConfigApplicationContext 构造方法 AnnotatedBean读取 Contional 条件注解解析类,是否需要忽略当前类 默认注解配置处理器 排序注解器 依赖解决处理器 处理@Lazy @Value @Qua...

my_juke
06/09
43
0
JAXB Annotation初步使用

JAXB(Java Architecture for XML Binding简称JAXB)允许Java开发人员将Java类映射为XML表示方式。JAXB提供两种主要特性:将一个Java对象序列化为XML,以及反向操作,将XML解析成Java对象。换...

秋风醉了
2014/07/02
361
0
Spring Boot实战之基础回顾

本文作者: 吴伟祥 本文链接: https://wuweixiang.cn/2018/08/21/Spring-Boot实战之基础回顾/ 版权声明: 本博客所有文章除特别声明外均为原创,采用CC BY-NC-SA 4.0 许可协议。转载请在文章开...

吴伟祥
2018/08/21
68
0
Java注解教程:自定义注解示例,利用反射进行解析

Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响。在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解。 注解是Java ...

哲别0
2017/10/23
60
0
Kotlin和Java混合开发必读:基本的互操作

在使用Kotlin和Java混合开发的时候,涉及到一些基本的互操作 一、属性的读写 1.Kotlin自动识别Java的属性的Getter和Setter 2.Java操作kotlin属性可以通过Getter和Setter的方式 二、空安全类型...

王木东
2018/04/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ES5

什么是ES5:比普通js运行要求更加严格的模式 为什么:js语言本身有很多广受诟病的缺陷 如何:在当前作用域的顶部添加:"use strict" 要求: 1、禁止给未声明的变量赋值 2、静默失败升级为错误...

wytao1995
50分钟前
7
0
c++ 内联函数调用快的原因

见图片分析

天王盖地虎626
今天
4
0
微服务之间调用控制器注解类型的差异

今天在一个业务服务通过Feign调用文件服务上传文件时遇到了几个问题: 1. 提示http请求头过大的问题; 此时需要修改bootstrap.yml,加入 server: max-http-header-size: 10000000 用以放大...

不再熬夜
今天
7
0
用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
今天
7
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部