Android注解
参考:http://www.jianshu.com/p/9ca78aa4ab4d
http://swiftlet.net/archives/1906
慕课网(java注解)
元注解是什么
元注解是由java提供的基础注解,负责注解其它注解
这是重载的注解源码:
JDK5时支持的元注解有
- @Documented
- @Retention
- @Target
- @Inherited
@Documented 文档注解
Documented是一个标记注解,没有成员。
@Documented 被修饰的注解会生成到javadoc中
@Retention 周期注解
周期注解就是注解的注册生命周期。
Retention注解的值是enum类型的RetentionPolicy。包括如下几种情况:
- SOURCE: 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃。Annotations are to be discarded by the compiler.
- CLASS: 注解被保留到class文件,jvm加载class文件时候被遗弃。这是默认的生命周期。
Annotations are to be recorded in the class file by the compiler
but need not be retained by the VM at run time. This is the default
behavior. - RUNTIME: 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在,保存到class对象中,可以通过反射来获取。
Annotations are to be recorded in the class file by the compiler and
retained by the VM at run time, so they may be read reflectively.
@Target 注解修饰类型
注解需要标明注解的修饰目标,这些信息是通过元注解实现。
这个注解的值是enum类型ElementType。包括以下几种情况:
- TYPE:指的是在类,接口(包括注解)或者enum上使用的注解。
- FIELD:指的在field属性,也包括enum常量使用的注解。
- METHOD:指的是在方法声明上使用的注解。
- PARAMETER:指的是在参数上使用的注解。
- CONSTRUCTOR: 指的是在构造器使用的注解。
- LOCAL_VARIABLE:指的是在局部变量上使用的注解。
- ANNOTATION_TYPE:指的是在注解上使用的元注解。
- PACKAGE:指的是在包上使用的注解。
@Inherited
加上这个元注解,可以允许子类继承父类的注解。如下面的例子中
如果没有加上这个元注解,Child类
@Description("I am super class annotation")
public class Person{
private String name;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
public class Child extend Person{
public String name(){
return null;
}
}
Class c =Class.forName("xxxx.xxx.xxx.Child");
boolean exist = c.isAnnotationPresent(Description.class);
if(!exist){
Description d = (Description) c.getAnnotation(Description.class);
String dValue = d.value();
}
输出:I am super class annotation
自定义注解
解析注解
新建一个注解类
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Description {
String value();
}
新建一个实体
@Description("I am class annotation")
public class Child extends Person{
@Override
@Description("I am method annotation")
public String name(){
return null;
}
}
解析注解
Class c =Class.forName("xxxx.xxx.xxx.Child");
boolean exist = c.isAnnotationPresent(Description.class);
if(!exist){
Description d = (Description) c.getAnnotation(Description.class);
String dValue = d.value();
}
自定义注解实例
根据注解自动生成sql语句
创建两个注解 @Table @Column
package com.imooc.test;
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)
public @interface Column {
String value();
}
package com.imooc.test;
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 Table {
String value();
}
创建实体
package com.imooc.test;
@Table("user")
public class Filter {
@Column("id")
private int id;
@Column("user_name")
private String userName;
@Column("nick_name")
private String nickName;
@Column("age")
private int age;
@Column("city")
private String city;
@Column("email")
private String email;
@Column("mobile")
private String mobile;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
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 String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}
测试
package com.imooc.test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
Filter f1 = new Filter();
f1.setId(10);//查询id为10的用户
Filter f2 = new Filter();
f2.setUserName("lucy");//模糊查询用户名为lucy的用户
f2.setAge(20);
Filter f3 = new Filter();
f3.setEmail("liu@sina.com,zh@163.com,77777@qq.com");//查询邮箱为其中的任意一个的用户
String sql1 = query(f1);
String sql2 = query(f2);
String sql3 = query(f3);
System.out.println(sql1);
System.out.println(sql2);
System.out.println(sql3);
System.out.println("*******************");
Filter2 f4 = new Filter2();
f4.setAmount(100);
f4.setLeader("大王");
f4.setName("学习部");
System.out.println(query(f4));
}
@SuppressWarnings({ "unchecked", "unused" })
private static String query(Object f){
StringBuilder sb = new StringBuilder();
//1.获取到class
Class c = f.getClass();
//2.获取到table的名字
boolean exist = c.isAnnotationPresent(Table.class);
if(!exist){
return null;
}
Table t = (Table) c.getAnnotation(Table.class);
String tableName = t.value();
sb.append("select * from ").append(tableName).append(" where 1=1");
//3.遍历所有的字段名
Field[] fArray = c.getDeclaredFields();
for(Field field:fArray){
//4.处理每个字段对应的sql
//4.1拿到字段名
boolean fExist = field.isAnnotationPresent(Column.class);
if(!fExist){
continue;
}
Column column = field.getAnnotation(Column.class);
String columnName = column.value();
//System.out.println(columnName);
//4.2拿到字段的值
String fieldName = field.getName();
//System.out.println(fieldName);
String getMethodName = "get"+fieldName.substring(0, 1).toUpperCase()+
fieldName.substring(1);//拿到字段名,第一个字母变大写,其余的直接拼接在后面 getXxxxx();
Object fieldValue = null;
try {
Method getMethod = c.getMethod(getMethodName);//通过反射取得字段的值
fieldValue = getMethod.invoke(f);
}
catch (Exception e) {
// TODO Auto-generated catch block
}
//4.3拼接sql
if(fieldValue==null||
(fieldValue instanceof Integer && (Integer)fieldValue==0 )){
continue;
}
sb.append(" and ");
if(fieldValue instanceof String){
if(((String)fieldValue).contains(",")){
String[]values = ((String) fieldValue).split(",");
sb.append("in(");
for(String v:values){
sb.append("'").append(v).append("'").append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
}else{
sb.append(columnName).append("=").append("'").append(fieldValue).append("'");
}
}else if(fieldValue instanceof Integer){
sb.append(columnName).append("=").append(fieldValue);
}
}
return sb.toString();
}
}