您的位置:首页 > 编程语言 > Java开发

Java注解

2015-09-02 22:28 375 查看

注解定义

用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。

Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具

注解有什么用?

使用Annotation之前(甚至在使用之后),XML被广泛的应用于描述元数据。XML配置其实就是为了分离代码和配置而引入的,而很多时候,希望使用一些和代码紧耦合的东西,比如想把某个方法声明为服务,那么使用Annotation会更好一些,因为这种情况下需要注解和方法紧密耦合起来。

Annotations仅仅是元数据,和业务逻辑无关

注解分类

按照运行机制分类

源码注解 :只在源码中存在,编译成.class中不存在

编译时注解 :在.class文件中也存在

运行时注解 :在运行阶段还会有逻辑作用的注解

按照来源分

JDK自带注解(比如:
@Override,@Deprecated


第三方注解

自定义注解

自定义注解

使用
@interface
关键字声明注解

成员以无参无异常的方式声明

可以指定默认值

成员是受限的,仅限于基本数据类型和String,Class,Annotation, Enumeration等类型。

如果注解只有一个成员,成员名只能叫
value()
,在使用时可以忽略成员名和赋值号

可以没有成员,没有成员的注解称为标识注解

元注解

package com.weixuan.annotationtest;

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

/**
* @ClassName: Description
* @Description: 注解的作用域
* @author 韦轩
* @date 2015年9月2日 下午6:28:36
*/
@Target({ ElementType.METHOD, ElementType.TYPE })

/**
* @ClassName: Description
* @Description: 注解的生命周期
* @author 韦轩
* @date 2015年9月2日 下午6:28:54
*/
@Retention(RetentionPolicy.RUNTIME)
/**
* @ClassName: Description
* @Description: 继承
* @author 韦轩
* @date 2015年9月2日 下午6:29:21
*
*/
@Inherited
/**
*
* @ClassName: Description
* @Description: Java doc
* @author 韦轩
* @date 2015年9月2日 下午6:29:49
*
*/
@Documented
public @interface Description {

String Desc();

String author();

int age() default 18;
}


使用自定义注解

@注解名(<成员1>= “”,<成员2>=”“)

@Description(desc="This is a test!",author="weixuan",age=22)
public void test() {

}


解析注解

通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

package com.weixuan.annotationtest;

import java.lang.reflect.Method;

public class Client {

public static void main(String[] args) throws ClassNotFoundException {
/**
* 使用类加载器加载类
*/
Class c = Class.forName("com.weixuan.annotationtest.TestAnnotation");

/**
* 找到类上面的注解
*/
boolean isExist = c.isAnnotationPresent(Description.class);

if (isExist) {
/**
* 拿到注解实例
*/
Description desc = (Description) c.getAnnotation(Description.class);
System.out.println(desc.desc());
System.out.println(desc.age());
System.out.println(desc.author());

}

/**
* 拿到方法上的注解
*/

Method[] methods = c.getMethods();

for (Method ms : methods) {

boolean isMExist = ms.isAnnotationPresent(Description.class);

if (isMExist) {
Description d = ms.getAnnotation(Description.class);
System.out.println(d.desc());
}
}
}

}


demo

为一个实体生成相应的SQL

Table.java

package com.weixuan.demo;

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

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Table {

String value();
}


Column.java

package com.weixuan.demo;

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

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
String value();
}


User.java

package com.weixuan.demo;

@Table("user")
public class User {

@Column("user_ID")
private Integer userID;

@Column("user_Name")
private String userName;

@Column("nick_Name")
private String nickName;

@Column("user_Age")
private Integer userAge;

@Column("city")
private String city;

@Column("email")
private String email;

public Integer getUserID() {
return userID;
}

public void setUserID(Integer userID) {
this.userID = userID;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getNickName() {
return nickName;
}

public void setNickName(String nickName) {
this.nickName = nickName;
}

public Integer getUserAge() {
return userAge;
}

public void setUserAge(Integer userAge) {
this.userAge = userAge;
}

public String getCity() {
return city;
}

public void setCity(String city) {
this.city = city;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public User(Integer userID, String userName, String nickName, Integer userAge, String city, String email) {
super();
this.userID = userID;
this.userName = userName;
this.nickName = nickName;
this.userAge = userAge;
this.city = city;
this.email = email;
}

public User() {
super();
}

@Override
public String toString() {
return "User [userID=" + userID + ", userName=" + userName + ", nickName=" + nickName + ", userAge=" + userAge
+ ", city=" + city + ", email=" + email + "]";
}

}


Test.java

package com.weixuan.demo;

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

public class Test {

private static String query(User user) {

StringBuilder stringBuilder = new StringBuilder();

Class c = user.getClass();

boolean isExist = c.isAnnotationPresent(Table.class);

if (!isExist)
return null;

Table table = (Table) c.getAnnotation(Table.class);

//获取表明=名
String tableName = table.value();

stringBuilder.append("select * from ").append(tableName).append(" where 1=1");

// 遍历所有字段

Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
boolean isEt = field.isAnnotationPresent(Column.class);
if (!isEt)
continue;
Column column = field.getAnnotation(Column.class);
String fieldName = field.getName();
// 拿到字段对应的值,先拿到get方法
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Object fieldValue = null;
try {
Method method = c.getMethod(getMethodName);
fieldValue = method.invoke(user);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
}
if (!(fieldValue == null)) {
if (fieldValue instanceof String)
stringBuilder.append(" and ").append(fieldName).append(" like '").append(fieldValue).append("'");
else {
stringBuilder.append(" and ").append(fieldName).append(" = ").append(fieldValue);
}
}
}
return stringBuilder.toString();
}

public static void main(String[] args) {
User user1 = new User();
user1.setUserID(1);

User user2 = new User();
user2.setCity("ChengDu");

User user3 = new User();
user3.setEmail("test@test.com");

String sql1 = query(user1);
System.out.println("user1 = " + sql1);
String sql2 = query(user2);
System.out.println("user2 = " + sql2);
String sql3 = query(user3);
System.out.println("user3 = " + sql3);
}
}


结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 注解