java 注解分析及自定义注解

注解概念:

  java提供了一种原程序中的元素关联任何信息和任何元数据的途径与方法。

注解分类:

运行机制分类:源码注解,编译时注解,运行时注解。

 来源分类:JDK的注解,第三方注解,自定义注解。

自定义注解语法要求: 

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.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
String name();
int age() default 18;
}

1.使用@interface关键字定义注解。

2.name()成员变量无参无异常。

3.可用default 为成员变量指定默认值

4.成员变量是受限的,合法的类型包括原始类型及String,Class,Annotation,Enumeration。

5.如果注解只有一个成员变量,则成员变量必须取名为value(),在使用时可以忽略成员变量名与赋值号(=)。

6.注解类可以没有成员变量,没成员变量的注解称为标识注解。

元注解:

  @Target(ElementType类型:CONSTURCTOR构造器方法声明,FIELD字段声明,LOCAL_VARI局部变量声明,METHOD方法声明,PACKGE包声明,PARAMETER参数声明,TYPE类接口声明)

  @Retention(RetentionPolicy类型:SOURCE只在源码中显示,编译时丢失,CLASS编译是记录到class中,运行时忽略,RUNTIME运行时存在,可以通过反射读取)

  @Inherited允许子类继承,解继承只能是类的注解,接口不能继承注解,方法上的注解也不可以被继承。

  @Documented生成javadoc文档会生成注解

解析注解:

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

自定义注解案例:自定义实现sql中的@Table与@Cloumm

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.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Table {
String value();
}

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.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cloumm {
String value();
}

@Table("user")
public class User {

@Cloumm("id")
int id;

@Cloumm("name")
String name;

@Cloumm("age")
int age;

@Cloumm("email")
String email;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getEmail() {
return email;
}

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

}

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

public class UserTest {
public static void main(String[] args) {
User user = new User();
user.setId(10);
user.setName("zs");
user.setEmail("[email protected],[email protected],[email protected]");
query(user);
}

private static void query(User user) {
//1.获取类加载器
Class c= user.getClass();
//2.获取类上的注解
boolean isExist = c.isAnnotationPresent(Table.class);
StringBuffer sb =new StringBuffer();
if(isExist) {
Table table = (Table)c.getAnnotation(Table.class);
String tableName = table.value();
sb.append("select * from "+ tableName + " where 1=1");
}
//3.获取所有字段
Field[] fields = c.getDeclaredFields();
for(Field f:fields) {
boolean fExist = f.isAnnotationPresent(Cloumm.class);
if(fExist) {
String tableName = f.getAnnotation(Cloumm.class).value();
//4获取字段值
//4.1反射获取字段方法
String fieldname = f.getName();
String methodName = "get"+fieldname.substring(0,1).toUpperCase()+fieldname.substring(1);
Object fieldValue = null;
try {
Method method = c.getMethod(methodName);
//4.2通过反射方法获取字段值
fieldValue = method.invoke(user);
} catch (Exception e) {
e.printStackTrace();
}
//4.3拼装sql
if(fieldValue==null || fieldValue instanceof Integer && (Integer)fieldValue == 0) {
continue;

}
if(fieldValue instanceof Integer) {
sb.append(" and "+tableName+" = "+fieldValue);
}
else if(fieldValue instanceof String){
if(((String) fieldValue).contains(",")) {
String[] values = ((String) fieldValue).split(",");
sb.append(" "+ tableName +" in (");
for(String v : values) {
sb.append("‘"+v+"‘,");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
}else {
sb.append(" and "+tableName+" = ‘"+fieldValue+"‘");
}
}

System.out.println(sb.toString());
}
}
}
}

原文地址:https://www.cnblogs.com/Wellszyw/p/9062227.html

时间: 2024-11-05 12:24:24

java 注解分析及自定义注解的相关文章

Java注解教程和自定义注解

Java注解提供关于代码的信息,并且对它们注解的代码没有直接的影响.在这篇教程中,我们将学习Java注解,如何自定义注解,注解用法和如何使用反射解析注解. Java注解在Java1.5被引用并且在一些Java框架如Hibernate,Jersey,Spring中被广泛使用.注解是被嵌入到程序自身中的程序的元数据.它可以被注解解析工具或编译器解析.我们也可以指定注解的生命周期,或者仅在编译期间可用或者直到运行时. 在引入注解之前,我们可以通过程序注释或者Java文档来获取程序的元数据,但是注解提供

深入JAVA注解(Annotation):自定义注解 (转)

原文出自:http://blog.csdn.net/yjclsx/article/details/52101922 一.基础知识:元注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email prote

【java开发系列】—— 自定义注解(转)

之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注解类型的一个实例,我们可以用它在某个类上进行标注,这样编译器在编译我们的文件时,会根据我们自己设定的方法来编译类. 注解都是什么呢?看下面这张图就明白了! 上面的图可以看出,注解大体上分为三种:标记注解,一般注解,元注解 这里面Override这个没测试出来,因为目前的Eclipse会自动帮我们排错

java基础知识:自定义注解

转自 深入了解注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected], [email protected], [email protected], [email protected] 这

Java注解教程及自定义注解

Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许多java框架中大量使用注解,如Hibernate.Jersey.Spring.注解作为程序的元数据嵌入到程序当中.注解可以被一些解析工具或者是编译工具进行解析.我们也可以声明注解在编译过程或执行时产生作用. 在使用注解之前,程序源数据只是通过java注释和javadoc,但是注解提供的功能要远远超

Java注解教程:自定义注解示例,利用反射进行解析

Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解. 注解是Java 1.5引入的,目前已被广泛应用于各种Java框架,如Hibernate,Jersey,Spring.注解相当于是一种嵌入在程序中的元数据,可以使用注解解析工具或编译器对其进行解析,也可以指定注解在编译期或运行期有效. 在注解诞生之前,程序的元数据存在的形式仅限于java注释或javadoc,但注解可以提供更多

java 注解学习(一、注解入门,自定义注解)

注解是在我们的代码中添加信息提供了一种更加简便的方法,通过注解,我们可以在适当的时候非常方便的使用一些数据.具体的注解的概念就不展开了,具体通过一个例子来说明自定义注解的使用. 具体的场景是,我们开了一家超市,超市里面有个自动货柜机,货柜机上的产品都有产品编号.价格.产品描述和注意事项,超市管理人员需要在自动售卖机卖出东西时,实时的进行记录,通过注解再进行售卖的时候进行相关信息的记录,为了实现这个目标,我们首先申明一个注解,如下: @Target(ElementType.METHOD) @Ret

【java开发系列】—— 自定义注解

之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注解类型的一个实例,我们可以用它在某个类上进行标注,这样编译器在编译我们的文件时,会根据我们自己设定的方法来编译类. 注解都是什么呢?看下面这张图就明白了! 上面的图可以看出,注解大体上分为三种:标记注解,一般注解,元注解 这里面Override这个没测试出来,因为目前的Eclipse会自动帮我们排错

java注解annotation,自定义注解

定义: package com.dxz.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //定义注解 @Target({ ElementType.TYPE, ElementType.FIELD, Ele