java注解--Annotation
- Annotation(注释) 概述
从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是 Annotation(注释)
Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理. 通过使用 Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。Annotation 可以像修饰符一样被使用, 可用于修饰包,类, 构造器, 方法, 成员变量, 参数, 局部变量的声明, 这些信息被保存在
Annotation 的 “name=value” 对中。Annotation 能被用来为程序元素(类, 方法, 成员变量等) 设置元数据
- 为什么使用注解
1,注解使得我们能够以将由编译器来测试和验证的格式,存储有关程序的额外信息
2,以用来生成描述符文件,甚至或是新的类定义,并且有助于减轻
3,更加干净易读的代码以及编译器类型检查编写样板代码的负担
- JDK内置注解
使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用. 用于修饰它支持的程序元素,三个基本的 Annotation:
@Override: 限定重写父类方法, 该注释只能用于方法,表示一个方法声明打算重写超类中的另一个方法声明。
@Deprecated: 用于表示某个程序元素(类, 方法等)已过时,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择
@SuppressWarnings: 抑制编译器警告。
package linkin; import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List; /**
*
* @version 1L
* @author LinkinPark
* @since 2014-11-27
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^3个常用的注解
*/
@SuppressWarnings("all")
public class Linkin
{ @Override
public String toString()
{
return "";
} public void test()
{
Date date = new Date();
int year = date.getYear();
int year1 = Calendar.getInstance().get(Calendar.YEAR);
} @SuppressWarnings("unchecked")
public void test1()
{
List<String> linkin = new ArrayList();
} }
- 自定义 Annotation
修饰符 @interface 名{
类型 元素名() [default value]
}
定义新的 Annotation 类型使用 @interface 关键字。Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明. 其方法名和返回值定义了该成员的名字和类型。可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字。没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据 Annotation
package linkin; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
*
* @version 1L
* @author LinkinPark
* @since 2014-11-27
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^如果Annotation的成员变量名为value的时候,程序中可以直接在Annotation后面的括号里面指定该成员变量的值,无须使用name=value的形式
*/
//如果要指定多个作用域,可以传入一个数组@Target({ ElementType.METHOD, ElementType.CONSTRUCTOR })
@Target(ElementType.METHOD)
//一般都是RUNTIME,来运行时通过反射也可以获得这个注解。@Retention(value=RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
public @interface LinkinAnnotation {
String value() default "";
String name() default "";
String[] names();
}
- JDK 的元 Annotation
JDK 的元 Annotation 用于修饰其他 Annotation 定义
1,@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:
RetentionPolicy.CLASS: 编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注释. 这是默认值
RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注释. 程序可以通过反射获取该注释
RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释
2,@Target: 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素. @Target 也包含一个名为 value 的成员变量
3,@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档
4,@Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注释。
上面的元注解经常用到就下面2个:@Target 该注解可以用于哪些地方。@Retention 表示需要在什么级别保存该注解信息
- 提取 Annotation 信息
JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 接口, 该接口代表程序中可以接受注释的程序元素
当一个 Annotation 类型被定义为运行时 Annotation 后, 该注释才是运行时可见, 当 class 文件被载入时保存在 class 文件中的 Annotation 才会被虚拟机读取
程序可以调用 AnnotationElement 对象的如下方法来访问 Annotation 信息。
- 什么是注解处理器
注解本身并不会对程序的编译方式产生影响。注解处理器能够通过在运行时使用反射获取在程序代码中的使用的注解信息,从而实现一些额外的功能。
下面的代码模拟演示juit测试框架:
package com.tanlan.crm.base.ap; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method; /**
*
* @version 1L
* @author LinkinPark
* @since 2014-11-27
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^模拟juit测试框架,即打了test注解的方法能被执行
*/
public class AnnoatationProcess {
public void process(TestDemo testDemo) throws Exception {
Class<TestDemo> c = TestDemo.class;
Method[] methods = c.getDeclaredMethods();
for (Method method : methods) {
// 判断方法是否使用了Test注解
if (method.isAnnotationPresent(Test.class)) {
method.invoke(testDemo);
}
}
} public static void main(String[] args) throws Exception {
TestDemo testDemo=new TestDemo();
AnnoatationProcess process=new AnnoatationProcess();
process.process(testDemo);
}
} @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Test { } class TestDemo {
@Test
public void test1() {
System.out.println("test1");
} @Test
public void test2() {
System.out.println("test2");
}
}
下面代码模拟了hibernate的实体注解映射:
package com.tanlan.crm.base.ap; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.Method; public class DAO { public void add1(User user) throws Exception {
String sql = "insert into ";
String values = "";
Class<User> c = User.class;
if (c.isAnnotationPresent(Table.class)) {
Table t = c.getAnnotation(Table.class);
String tableName = t.value();
if (tableName.equals("")) {
tableName = c.getSimpleName();
}
sql += tableName + "(";
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Column.class)) {
Column col = field.getAnnotation(Column.class);
String colName = col.value();
if (colName.equals("")) {
colName = field.getName();
}
sql += colName + ",";
Method method = c.getDeclaredMethod("get"
+ toUpper(colName));
Object v = method.invoke(user);
values += "'" + v + "',";
}
}
}
sql = sql.substring(0, sql.length() - 1);
sql += ") values(" + values.substring(0, values.length() - 1) + ")";
System.out.println(sql);
} public <E> void add(E e) throws Exception {
String sql = "insert into ";
String values = "";
Class<?> c = e.getClass();
if (c.isAnnotationPresent(Table.class)) {
Table t = c.getAnnotation(Table.class);
String tableName = t.value();
if (tableName.equals("")) {
tableName = c.getSimpleName();
}
sql += tableName + "(";
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Column.class)) {
Column col = field.getAnnotation(Column.class);
String colName = col.value();
if (colName.equals("")) {
colName = field.getName();
}
sql += colName + ",";
Method method = c.getDeclaredMethod("get"
+ toUpper(colName));
Object v = method.invoke(e);
values += "'" + v + "',";
} } }
sql = sql.substring(0, sql.length() - 1);
sql += ") values(" + values.substring(0, values.length() - 1) + ")";
System.out.println(sql);
} private static String toUpper(String s) {
String first = s.substring(0, 1);
return first.toUpperCase() + s.substring(1);
} public static void main(String[] args) throws Exception {
User user=new User();
user.setName("Tom");
user.setPassword("123456"); DAO dao=new DAO();
dao.add(user); Product product=new Product();
product.setName("电视");
dao.add(product); }
} @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Table {
String value() default ""; } @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Column {
String value() default "";
} @Table
class User {
@Column("name")
private String name;
@Column
private String password; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} } @Table("crm_product")
class Product {
@Column
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
java注解--Annotation的更多相关文章
- Java - 注解 (Annotation)
Java - 注解 (Annotation) 一.基本的 Annotation > 使用 Annotation 时要在其前面增加 @符号,并把该 Annotation 当成一个修饰符 ...
- Java注解Annotation(一)
Java注解Annotation(一)——简介 这一章首先简单介绍一下注解,下一章会给出一个注解应用的DEMO. 1. 元注解 元注解的作用是负责注解其他的注解. JDK1.5中,定义了4个标准的me ...
- Java注解(Annotation)详解
转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...
- Java注解Annotation与自定义注解详解
Java注解简介 开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的应用场景和如何自定义注解. 下面列举开发中常见的注解 @Override:用于标识 ...
- 深入JAVA注解-Annotation(学习过程)
JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...
- 深入学习JAVA注解-Annotation(学习过程)
JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...
- java注解(Annotation)解析
注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...
- Java注解Annotation学习
学习注解Annotation的原理,这篇讲的不错:http://blog.csdn.net/lylwo317/article/details/52163304 先自定义一个运行时注解 @Target( ...
- java注解Annotation
扯扯注解的蛋 为什么学习注解?学习注解有什么好处?学完能做什么? 1.能够读懂别人的代码,特别是框架相关的代码 2.让编程更加简洁,代码更加清晰 3.让别人高看你一眼 注解是java1.5引入的 概念 ...
- java 注解Annotation
什么是注解? 注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的. java注解又叫java标注,java提供了一套机制,使得我们可以对 ...
随机推荐
- 【01背包】洛谷P1282多米诺骨牌
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...
- [转载]mysql绑定参数bind_param原理以及防SQL注入
假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd.. 下面我们来模拟一个用户登录的过程.. <?php $username = "aa ...
- python requirements使用方法
记得导入导出包的时候要想激活虚拟环境. 1.导出requirements方法 pip freeze > requirements.txt 2.安装requirements方法 pip insta ...
- Node+mongodb线上部署到阿里云
Node+mongodb线上部署到阿里云 部署使用的主要工具是pm2+nginx,使用码云的私有仓库,自动部署到服务器,私有仓库和服务器要事先设置好免密码登录.使用DNSPOD进行域名解析.事先准备好 ...
- RAC+ASM 添加控制文件
环境介绍:11g RAC 使用 ASM 磁盘组,控制文件只有一个,需要进行添加 参照 MOS 文档 How to Multiplex Control File In RAC Database (文档 ...
- [bzoj1587] [Usaco2009 Mar]Cleaning Up 打扫卫生
首先(看题解)可得...分成的任意一段中的不同颜色个数都<=根号n...不然的话直接分成n段会更优= = 然后就好做多了.. 先预处理出对于每头牛i,和它颜色相同的前一头和后一头牛的位置. 假设 ...
- CF 615D Multipliers
题目:http://codeforces.com/contest/615/problem/D 求n的约数乘积. 设d(x)为x的约数个数,x=p1^a1+p2^a2+……+pn^an,f(x)为x的约 ...
- Codeforces 626C
...
- Replacement(思维题)
题目链接:http://codeforces.com/problemset/problem/570/C C. Replacement time limit per test 2 seconds mem ...
- QQ群友在线/离线,如何测试?
上篇文章『QQ好友在线/离线,如何测试?』针对即时通讯的"状态"进行了分析和总结,主要说到了QQ好友在线/离线实现方案,测试过程中需要注意的测试点. 针对好友状态实时性的要求需要使 ...