`
lidxgz
  • 浏览: 11780 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

annotation初探

    博客分类:
  • Java
阅读更多

今天研究Annotation分析JavaBean信息,通过在JavaBean中添加的注解来获得信息真是非常方便。

Annotation是在已经发布的JDK1.5(tiger)中增加新的特色。它提供一种机制,将程序的元素如:类,方法,属性,参数,本地变量,包和元数据联系起来。这样编译器可以将元数据存储在Class文件中。这样虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。

定义Annotation

/**
 * @(#) Id.java 1.0, 2008-3-5
 * Copyright 徐国智. All rights reserved.
 * QQ:13629995    MSN:xgzcc@hotmail.com
 * Email:lidxgz@163.com,lidxgz@gmail.com
 */

package com.xugz.core.annotation;

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

/**
 * @author 徐国智
 *
 * @version 1.0,2008-3-5 上午10:45:57
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Id {
	
}

 

 

/**
 * @(#) Column.java 1.0, 2008-3-5
 * Copyright 徐国智. All rights reserved.
 * QQ:13629995    MSN:xgzcc@hotmail.com
 * Email:lidxgz@163.com,lidxgz@gmail.com
 */

package com.xugz.core.annotation;

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

/**
 * @author 徐国智
 *
 * @version 1.0,2008-3-5 上午10:50:42
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {
	String name() default "";
}

 

 

说明:

Retention指示注释类型的注释要保留多久。

RetentionPolicy注释保留策略。枚举类型
CLASS
          编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
RUNTIME
          编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
SOURCE
          编译器要丢弃的注释。
Target指示注释类型所适用的程序元素的种类。
ElementType程序元素类型。枚举类型
ANNOTATION_TYPE
          注释类型声明
CONSTRUCTOR
          构造方法声明
FIELD
          字段声明(包括枚举常量)
LOCAL_VARIABLE
          局部变量声明
METHOD
          方法声明
PACKAGE
          包声明
PARAMETER
          参数声明
TYPE
          类、接口(包括注释类型)或枚举声明

在JavaBean上添加注解

/**
 * @(#) Word.java 1.0, 2008-3-4
 * Copyright 2007 徐国智. All rights reserved.
 * QQ:13629995;MSN:xgzcc@hotmail.com;
 * Email:lidxgz@163.com
 */

package com.xugz.bean;

import com.xugz.core.annotation.Column;
import com.xugz.core.annotation.Id;

/**
 * @author Xugz
 *
 * @version 1.0,2008-3-4
 */
public class Word {
/**
 *为属性wordId添加注解,指定Id属性和字段名
*/
	@Id @Column(name="id")
	private Integer wordId;
	private String word;
	private String explain;
	private String example;
	private Integer state;
	private Integer learnCount;
	private Integer newOrder;
/**
*getter和setter方法省略
*/
}

 

 

利用反射机制分析JavaBean

/**
 * @(#) Reflect.java 1.0, 2008-3-5
 * Copyright 徐国智. All rights reserved.
 * QQ:13629995    MSN:xgzcc@hotmail.com
 * Email:lidxgz@163.com,lidxgz@gmail.com
 */

package com.xugz.core.reflect;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import com.xugz.core.annotation.Column;
import com.xugz.core.annotation.Id;

/**
 * @author 徐国智
 * 
 * @version 1.0,2008-3-5 上午10:54:32
 */
public class Reflect {
	private String className;

	private Class cl;

	public Reflect(String className) {
		this.className = className;
		try {
			cl = Class.forName(className);
		} catch (Exception e) {
		}
	}

	public String getId() {
		try {
			if (cl != null && !cl.isInstance(Object.class)) {
				Field[] fields = cl.getDeclaredFields();
				for (Field field : fields) {
					Id id = field.getAnnotation(Id.class);
					if (id == null)
						continue;
					return getColumnName(field.getName());
				}
			}
		} catch (Exception e) {

		}
		return null;
	}

	public String getColumnName(String name) {
		try {
			if (cl != null && !cl.isInstance(Object.class)) {
				Field field = cl.getDeclaredField(name);
				Column column = field.getAnnotation(Column.class);
				if (column == null)
					return field.getName();
				else
					return column.name();

			}
		} catch (Exception e) {

		}
		return null;
	}
	public List<String> getFieldNames(){
		List<String> list = new ArrayList<String>();
		try {
			if (cl != null && !cl.isInstance(Object.class)) {
				Field[] fields = cl.getDeclaredFields();
				for(Field field:fields){
				Column column = field.getAnnotation(Column.class);
				if (column == null)
					list.add(field.getName());
				else
					list.add(column.name());
				}
				return list;
			}
		} catch (Exception e) {

		}
		return null;
	}
}

 

 

测试

/**
 * @(#) TestAnnotation.java 1.0, 2008-3-5
 * Copyright 徐国智. All rights reserved.
 * QQ:13629995    MSN:xgzcc@hotmail.com
 * Email:lidxgz@163.com,lidxgz@gmail.com
 */

package test;

import java.util.List;

import com.xugz.core.reflect.Reflect;

/**
 * @author 徐国智
 *
 * @version 1.0,2008-3-5 上午11:08:41
 */
public class TestAnnotation {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成方法存根
		Reflect reflect = new Reflect("com.xugz.bean.Word");
		System.out.println("id===="+reflect.getId());
		List<String> list = reflect.getFieldNames();
		for(String name:list){
			System.out.println(name);
		}
	}

}

 

分享到:
评论

相关推荐

    springmvc初探(annotation)

    标题 "springmvc初探(annotation)" 暗示了我们将探讨Spring MVC框架的注解驱动编程。Spring MVC是Spring框架的一部分,专门用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构,使开发者可以更有效地组织和...

    jakarta.annotation-api-1.3.5-API文档-中文版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    javax.annotation-api-1.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.2.jar; 赠送原API文档:javax.annotation-api-1.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-1.2.pom;...

    jakarta.annotation-api-1.3.5-API文档-中英对照版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    javax.annotation-api-1.3.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.3.2.jar; 赠送原API文档:javax.annotation-api-1.3.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.3.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-...

    Annotation手册

    7. **元Annotation**:元Annotation是用于定义其他Annotation的Annotation,例如`@Retention`定义Annotation的生命周期(编译时、类加载时或运行时),`@Target`指定Annotation可以应用到哪些程序元素,`@Documented...

    annotation-1.1.0.jar

    @androidx.annotation.NonNull 缺失的兼容、androidx.annotation兼容包

    annotation的jar包

    javax.annotation-3.0.jar javax.annotation-3.0.jar javax.annotation-3.0.jar

    自定义的Annotation

    在iOS开发中,Annotation是苹果地图(MapKit)框架中的一个重要概念,用于在地图上添加可视化标记,以展示特定地理位置的信息。自定义的Annotation则允许开发者根据需求个性化地图上的标注,比如添加图片、自定义...

    Annotation技术

    【Annotation技术】是Java语言中的一个重要特性,引入于JDK5,主要目的是为程序元素(如包、类、方法、变量等)添加元数据,即附加信息,这些信息可以被编译器、IDE工具或者运行时系统使用。Annotation不会直接改变...

    Annotation详细介绍(大全)

    Annotation是Java语言中的一种元数据,它提供了在代码中附加信息的能力,这些信息可以在编译时或运行时被解析和使用。Annotation的本质是一种特殊类型的注解,它允许开发者向编译器、JVM或者工具提供关于代码的额外...

    annotation

    在IT行业中,注解(Annotation)是Java编程语言的一个重要特性,它允许程序员在代码中嵌入元数据,提供了一种安全的方法来修饰程序元素,如类、方法、变量等。注解不会直接影响代码的执行,但它们可以被编译器或运行...

    用Annotation简化Java程序的开发(PDF)

    ### 用Annotation简化Java程序的开发 #### 一、引言 随着软件开发技术的不断发展,特别是Java语言的广泛应用,开发者面临着如何有效地管理和配置代码的问题。传统的做法是使用XML文件来配置程序的各种设置,但这种...

    JAVA 标注annotation

    Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...

    javax.annotation.jar

    javax.annotation.jar

    Hibernate Annotation jar

    这里面包涵了需要用Hibernate Annotation时,所需要的所有jar包! 现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用...

    jar包_javax.annotation.zip

    在本例中,我们关注的`jar`包是`javax.annotation.zip`,它包含了`javax.annotation`相关的API,主要用于处理Java的注解(Annotation)。 `javax.annotation`是Java标准版(Java SE)的一部分,提供了标准的注解,...

    hibernate 注解 annotation 教程

    hibernate 注解 annotation 教程

Global site tag (gtag.js) - Google Analytics