`

Java 注解编程学习案例

阅读更多

注解原理在这里就不具体介绍了,一定要记住你会反射就OK

因为注解也是类中的一部分好,我位来看看例子吧

 

1. 需求介绍

    当用户给出一个类,就可以根据这个类的成员属性变量生成 name=liuqing分割符sex=male等

    当然name 也是可以改变的 比如 性名=liuqing,可以自定义顺序

    在这里我们将使用注解来实现 name 表示可变名字,如果name(成员属性变量) 

    order 为排序顺序。

2. 定义接口

 

package com.zk.com.component.annotation;

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

/**
 * @date 2011-4-15
 * @see  
 * @author 刘庆
 * @version 1.0
 *
 */
@Retention(value=RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.FIELD})
public @interface ComAnnotation {
    /**
     * 显示字符输出名
     * @return String
     */
	String name() default "";
	/**
	 * 排序如果按order 值排序
	 * @return
	 */
	int order() default 1;
}

 

3. 实现接口方法

  

  

package com.zk.com.component.annotation;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

/**
 * 2011-4-15
 * @author liuqing
 *
 */
public class ComComponentInfoUtil {
	//use jdk logger
	private static Logger log = Logger.getLogger(ComComponentInfoUtil.class.getName());
	
	/**
	 * Test ComComponentInfo
	 * @param args
	 * @throws Exception
	 */
	public static void main(String args[]) throws Exception {
		
		ComComponentInfoUtil com = new ComComponentInfoUtil();
		UserInfoTest p = new UserInfoTest();
		p.setAge(23);
		p.setUsb(false);
		p.setSex("male");
		p.setId("2323");
		System.out.println(com.getObjectToStr(p,"$|$",true));
	}
	
	/**
	 * spit string 
	 * @param obj
	 * @param spit
	 * @param isOrder
	 * @return
	 * @throws Exception
	 */
	public String getObjectToStr(Object obj,String spit,boolean isOrder) 
				throws Exception {
		StringBuffer strBuff = new StringBuffer();
		Class clazz = obj.getClass();
		HashMap<Integer,String> map = new HashMap<Integer,String>();
		int i = 0;
		for (Method method:clazz.getMethods()) {
			if (this.isClassMethod(method.getName())) {
				ComAnnotation comAnnotation = 
					this.getMethodAndFieldAnnotion(method, clazz);
				if (i > 0) {
					strBuff.append(spit);
				}
				if (comAnnotation != null) {
					//display information
					if (comAnnotation.name() == null 
							|| "".equals(comAnnotation.name())) {
						strBuff.append(this.getFieldNameByMethodName(method
								.getName()) + "=").
						append(method.invoke(obj, null));
					}
					else {
						strBuff.append(comAnnotation.name()+"=").
						append(method.invoke(obj, null));
					}
					//if true is order
					if (isOrder) {
						if (comAnnotation.name() == null 
								|| "".equals(comAnnotation.name())) {
							String str = this.getFieldNameByMethodName(
									method.getName()) + "=" +
							method.invoke(obj, null);
							if (map.containsKey(comAnnotation.order())) {
								log.info("name " +comAnnotation.name() + ":order = "
										+ comAnnotation.order() + " already exists ");
							}
							map.put(comAnnotation.order(), str);
						} 
						else {
							String str = comAnnotation.name() + "=" + 
							method.invoke(obj, null);
							if (map.containsKey(comAnnotation.order())) {
								log.info("name " +comAnnotation.name() + ":order = "
										+ comAnnotation.order() + " already exists ");
							}
							map.put(comAnnotation.order(), str);
						}
					}
				}
				else {
					if (comAnnotation.name() == null 
							|| "".equals(comAnnotation.name())) {
						strBuff.append(this.getFieldNameByMethodName(
								method.getName()) + "=").
						append(method.invoke(obj, null));
					}
					else {
						strBuff.append(comAnnotation.name()+"=").
						append(method.invoke(obj, null));
					}
					//if true is order
					if (isOrder) {
					    String str = comAnnotation.name() + "=" + 
					    method.invoke(obj, null);
					    if (map.containsKey(comAnnotation.order())) {
					    	log.info("name " +comAnnotation.name() + ":order = "
					    			+ comAnnotation.order() + " already exists ");
					    }
					    map.put(comAnnotation.order(), str);
					}
				}
				i++;
			}
		}
		
		if (isOrder) {
			int j = 0 ;
			StringBuffer strBuffOrder = new StringBuffer();
			for(Map.Entry<Integer,String> en:map.entrySet()) {
				if (j > 0){
					strBuffOrder.append(spit + en.getValue());
				} 
				else {
					strBuffOrder.append(en.getValue());
				}
				j++;
			}
			return strBuffOrder.toString();
		} 
		else {
			return strBuff.toString();
		}
	}
	

	/**
	 * getAnnotation Information
	 * @param method
	 * @param clazz
	 * @return
	 * @throws Exception
	 */
	public ComAnnotation getMethodAndFieldAnnotion(Method method,
			Class clazz) throws Exception{
		ComAnnotation comAnn = method.getAnnotation(ComAnnotation.class);
		if (comAnn != null) {
			return comAnn;
		}
		else {
			String varFieldName = this.getFieldNameByMethodName(method
					.getName());
			Field field = clazz.getDeclaredField(varFieldName);
			comAnn = field.getAnnotation(ComAnnotation.class);
			if (field != null && comAnn != null) {
				return comAnn;
			}
		}
		return comAnn;
	}
	
	
	/**
	 * is methodName query fieldName
	 * @param methodName
	 * @return String
	 */
	public String getFieldNameByMethodName(String methodName) {
		
		if (methodName.startsWith("get")) {
			String varFieldName = methodName.substring(3);
			String varUpToLower = this.getUpToLower(varFieldName);
			if (!("".equals(varUpToLower))) {
				return varUpToLower;
			}
		}
		else if (methodName.startsWith("is")) {
			String varFieldName = methodName.substring(2);
			String varUpToLower = this.getUpToLower(varFieldName);
			if (!("".equals(varUpToLower))) {
				return varUpToLower;
			}
		}
		return null;
	}
	
	/**
	 * getName ---> Name ----return name;
	 * @param str
	 * @return String
	 */
    public String getUpToLower(String str) {
    	if (str != null && !("".equals(str))
    			&& str.length() > 0) {
    		char ch[] = str.toCharArray();
    		ch[0] = (char)(ch[0] + 32);
    		return new String(ch);
    	}
    	return "";
    }
	
    /**
     * if true is Field
     * @param methodName
     * @return
     */
	public boolean isClassMethod(String methodName) {
		if (methodName != null && methodName.length() > 3
				&& (methodName.startsWith("get")) 
				&& (!methodName.equals("getClass")) ) {
			return true;
		}
		else if (methodName != null && methodName.length() > 2
					&& (methodName.startsWith("is"))) {
			return true;
		}
		else {
			return false;
		}
	}

}

   

 

 

4.因为可以在getter方法上加注解也可以在成员属性上加注解 例如

 

package com.zk.com.component.annotation;

/**
 * 
 * @author liuqing
 *
 */
public class UserInfoTest {
	
	@ComAnnotation(name="编号",order=1)
	private String id;
	@ComAnnotation(name="姓名",order=44)
	private String name;
	
	private int age;
	
	private String sex;
	
	private boolean isUsb;

	public String getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	@ComAnnotation(order=2)
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
    @ComAnnotation(name="性别方法",order=3)
	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	@ComAnnotation(name="其它方法",order=3)
	public boolean isUsb() {
		return isUsb;
	}

	public void setUsb(boolean isUsb) {
		this.isUsb = isUsb;
	}

}

 

 

   运行

 

 编号=2323$|$age=23$|$性别方法=male$|$姓名=null
2011-4-15 15:51:42 com.zk.com.component.annotation.ComComponentInfoUtil getObjectToStr
信息: name 性别方法:order = 3 already exists

 

 

核心工具修正

package com.zk.an;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

/**
 * use example
 * ComComponentInfoUtil com = new ComComponentInfoUtil();
 * 	UserInfoTest p = new UserInfoTest();
 * 	p.setAge(23);
 * 	p.setUsb(false);
 * 	p.setSex("male");
 * 	p.setId("2323");
 * 	com.getObjectToStr(p,"$|$",true);
 * 2011-4-15
 * @author liuqing
 *
 */
public class ComComponentInfoUtil {
	//use jdk logger
	private static Logger log = Logger.getLogger(ComComponentInfoUtil.class.getName());
	
	/**
	 * Generation input string method
	 * @param obj
	 * @return
	 */
	public String input(Object obj){
		String inStr = null;
		try {
			inStr = this.comInputToString(obj, "$|$", false);
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		return inStr;
	}
	/**
	 * Generation output string method
	 * @param obj
	 * @return
	 */
	public String output(Object obj) {
		String outStr = null;
		try {
			outStr = this.comOutputToString(obj, "$|$", false);
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		return outStr;
		
	}
	/**
	 * Generation input string method
	 * @param obj
	 * @param order
	 * @return
	 */
	public String input(Object obj,boolean order){
		String inStr = null;
		try {
			inStr = this.comInputToString(obj, "$|$", order);
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		return inStr;
	}
	/**
	 * Generation output string method
	 * @param obj
	 * @param order
	 * @return
	 */
	public String output(Object obj,boolean order) {
		String outStr = null;
		try {
			outStr = this.comOutputToString(obj, "$|$", order);
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		return outStr;
	}
	
	/**
	 * spit string 
	 * @param obj
	 * @param spit
	 * @param isOrder
	 * @return String
	 * @throws Exception
	 */
	public String comInputToString(Object obj,String spit,boolean isOrder) 
				throws Exception {
		StringBuffer strBuff = new StringBuffer();
		Class clazz = obj.getClass();
		HashMap<Integer,String> map = new HashMap<Integer,String>();
		int i = 0;
		for (Method method:clazz.getMethods()) {
			if (this.isClassMethod(method.getName())) {
				ComInput comAnnotation = 
					this.getInputMethodAndFieldAnnotion(method, clazz);
				if (comAnnotation != null) {
					//display information
					if (isOrder) {
						
						String str = comAnnotation.name() + "=" + 
						method.invoke(obj, null);
						if (map.containsKey(comAnnotation.order())) {
							log.info("name " +comAnnotation.name() + ":order = "
									+ comAnnotation.order() + " already exists ");
						}
						map.put(comAnnotation.order(), str);
					} 
					else {
						if (comAnnotation.name() != null 
								&& !("".equals(comAnnotation.name())) ) {
							if (i > 0) {
								strBuff.append(spit);
							}
							strBuff.append(comAnnotation.name()+"=").
							append(method.invoke(obj, null));
							i++;
						}
					}
				}
			}
		}
		
		if (isOrder) {
			int j = 0 ;
			StringBuffer strBuffOrder = new StringBuffer();
			for(Map.Entry<Integer,String> en:map.entrySet()) {
				if (j > 0){
					strBuffOrder.append(spit + en.getValue());
				} 
				else {
					strBuffOrder.append(en.getValue());
				}
				j++;
			}
			return strBuffOrder.toString();
		} 
		else {
			return strBuff.toString();
		}
	}
	
	/**
	 * spit string 
	 * @param obj
	 * @param spit
	 * @param isOrder
	 * @return String
	 * @throws Exception
	 */
	public String comOutputToString(Object obj,String spit,boolean isOrder) 
				throws Exception {
		StringBuffer strBuff = new StringBuffer();
		Class clazz = obj.getClass();
		HashMap<Integer,String> map = new HashMap<Integer,String>();
		int i = 0;
		for (Method method:clazz.getMethods()) {
			if (this.isClassMethod(method.getName())) {
				ComOutput comOutputAnnotation = 
					this.getOutputMethodAndFieldAnnotion(method, clazz);
				if (comOutputAnnotation != null) {
					//display information
					if (isOrder) {
						
						String str = comOutputAnnotation.name() + "=" + 
						method.invoke(obj, null);
						if (map.containsKey(comOutputAnnotation.order())) {
							log.info("name " +comOutputAnnotation.name() + ":order = "
									+ comOutputAnnotation.order() + " already exists ");
						}
						map.put(comOutputAnnotation.order(), str);
					} 
					else {
						if (comOutputAnnotation.name() != null 
								&& !("".equals(comOutputAnnotation.name())) ) {
							if (i > 0) {
								strBuff.append(spit);
							}
							strBuff.append(comOutputAnnotation.name()+"=").
							append(method.invoke(obj, null));
							i++;
						}
					}
				}
				
			}
		}
		
		if (isOrder) {
			int j = 0 ;
			StringBuffer strBuffOrder = new StringBuffer();
			for(Map.Entry<Integer,String> en:map.entrySet()) {
				if (j > 0){
					strBuffOrder.append(spit + en.getValue());
				} 
				else {
					strBuffOrder.append(en.getValue());
				}
				j++;
			}
			return strBuffOrder.toString();
		} 
		else {
			return strBuff.toString();
		}
	}

	/**
	 * getAnnotation Information
	 * @param method
	 * @param clazz
	 * @return
	 * @throws Exception
	 */
	public ComInput getInputMethodAndFieldAnnotion(Method method,
			Class clazz) throws Exception{
		ComInput comAnn = method.getAnnotation(ComInput.class);
		if (comAnn != null) {
			return comAnn;
		}
		else {
			String varFieldName = this.getFieldNameByMethodName(method
					.getName());
			Field field = clazz.getDeclaredField(varFieldName);
			comAnn = field.getAnnotation(ComInput.class);
			if (field != null && comAnn != null) {
				return comAnn;
			}
		}
		return comAnn;
	}
	
	public ComOutput getOutputMethodAndFieldAnnotion(Method method,
			Class clazz) throws Exception{
		ComOutput comAnn = method.getAnnotation(ComOutput.class);
		if (comAnn != null) {
			return comAnn;
		}
		else {
			String varFieldName = this.getFieldNameByMethodName(method
					.getName());
			Field field = clazz.getDeclaredField(varFieldName);
			comAnn = field.getAnnotation(ComOutput.class);
			if (field != null && comAnn != null) {
				return comAnn;
			}
		}
		return comAnn;
	}
	
	/**
	 * is methodName query fieldName
	 * @param methodName
	 * @return String
	 */
	public String getFieldNameByMethodName(String methodName) {
		
		if (methodName.startsWith("get")) {
			String varFieldName = methodName.substring(3);
			String varUpToLower = this.getUpToLower(varFieldName);
			if (!("".equals(varUpToLower))) {
				return varUpToLower;
			}
		}
		else if (methodName.startsWith("is")) {
			String varFieldName = methodName.substring(2);
			String varUpToLower = this.getUpToLower(varFieldName);
			if (!("".equals(varUpToLower))) {
				return varUpToLower;
			}
		}
		return null;
	}
	
	/**
	 * getName ---> Name ----return name;
	 * @param str
	 * @return String
	 */
    public String getUpToLower(String str) {
    	if (str != null && !("".equals(str))
    			&& str.length() > 0) {
    		char ch[] = str.toCharArray();
    		ch[0] = (char)(ch[0] + 32);
    		return new String(ch);
    	}
    	return "";
    }
	
    /**
     * if true is Field
     * @param methodName
     * @return
     */
	public boolean isClassMethod(String methodName) {
		if (methodName != null && methodName.length() > 3
				&& (methodName.startsWith("get")) 
				&& (!methodName.equals("getClass")) ) {
			return true;
		}
		else if (methodName != null && methodName.length() > 2
					&& (methodName.startsWith("is"))) {
			return true;
		}
		else {
			return false;
		}
	}

}

 

 

 

 

 

分享到:
评论

相关推荐

    JAVA编程小案例

    【JAVA编程小案例】是一个适合初学者的编程实践项目,旨在帮助新手逐步理解并掌握Java编程语言的基础概念和核心语法。在这个案例中,你将有机会接触到以下关键知识点: 1. **Java环境配置**:首先,你需要了解如何...

    java编程技巧典型案例解析

    Java编程技巧典型案例解析 在Java编程领域,掌握高效、实用的编程技巧对于提升代码质量、优化性能以及提高开发效率至关重要。本资料集旨在通过一系列典型示例,深入剖析Java编程中的常见问题及其解决策略,帮助...

    Java编程技巧典型案例解析

    《Java编程技巧典型案例解析》一书聚焦于这些关键技巧,通过24个精心挑选的源代码案例,深入浅出地展示了Java编程中的精华所在。以下是根据标题、描述以及压缩包子文件的文件名称列表,提炼出的一些核心Java编程知识...

    java se全程学习案例

    这个“java se全程学习案例”压缩包包含了作者在深入学习Java SE过程中的实战代码,对于初学者来说,是提升Java基础知识和代码实践能力的宝贵资源。 Java SE的学习涵盖了许多方面,包括但不限于: 1. **基础语法**...

    java 编程 经典案例集锦

    Java编程经典案例集锦是一份宝贵的资源,涵盖了Java语言的基础到高级应用,旨在帮助学习者深入理解和实践Java编程。这份资料包含了一百多个精心设计的小案例,每个案例都是经过实际运行验证的,确保了代码的正确性和...

    java编程200例(附:JAVA文档完全解读中文版)

    学习Java编程,除了理论知识和实践案例,还需要不断进行代码调试和项目实战,这样才能更好地巩固所学,提升编程能力。同时,加入相关的技术社区,参与讨论和问题解答,也能加速学习进程。"Java编程200例"提供的实例...

    Java编程规范学习资料

    《JAVA编程规范试题2》和《JAVA编码规范试题3》可能是对前面规范的补充和深入,可能包含更多的实战案例和常见问题解析,比如多线程编程、IO流操作、集合框架的使用等。这些题目可以帮助你检验对Java规范的理解程度,...

    求精要诀——Java EE编程开发案例精讲 PPT

    《求精要诀——Java EE编程开发案例精讲》是一本深入浅出的教程,旨在帮助读者掌握Java EE(企业版)的编程技术。PPT形式的教程通常以清晰直观的方式呈现复杂的概念,便于学习和理解。这个压缩包包含了一系列章节的...

    java案例分析 java 案例 好资源

    这些案例旨在帮助学习者掌握Java编程的关键技巧,提升编程能力。 1. **基础语法与数据类型**:Java的基础包括变量声明、数据类型(如整型、浮点型、字符型和布尔型)、运算符、流程控制(如if语句、switch语句、for...

    Java编程案例精解

    《Java编程案例精解》是一本深入探讨Java编程实践的书籍,其光盘资料包含了丰富的实例代码和教学资源,旨在帮助读者深入理解Java语言的核心概念和技术。这份资料涵盖了从基础语法到高级特性的广泛内容,适合初学者和...

    java基础的详细案例笔记

    11. **枚举与注解**:枚举是Java中的特殊数据类型,而注解则是一种元数据,可以用于代码的元编程,笔记可能讲解它们的用法和作用。 以上只是对Java基础部分的一些基本概述,实际的"Java基础的详细案例笔记"应该包含...

    java数据库开发编程案例之销售管理系统

    总之,这个"java数据库开发编程案例之销售管理系统"为学习者提供了一个全面了解Java数据库开发的实践平台,涵盖了从数据库设计、JDBC使用到MVC架构等多个方面,是初学者宝贵的参考资料。通过这个案例,开发者不仅...

    java实用编程100例.rar

    Java编程语言作为世界上最流行的编程语言之一,以其面向对象、跨平台和丰富的库支持而闻名。在《java实用编程100例》这...通过学习和实践这些实例,开发者能够逐步精通Java编程,并为更复杂的应用开发打下坚实的基础。

    java数据库开发编程案例之网络购物

    总之,"java数据库开发编程案例之网络购物"是一个全面的学习资源,涵盖了从基础的Java编程到高级的数据库交互、Web开发以及系统架构等多个方面。通过这个案例,你可以逐步建立起实际开发中的技能和经验,为以后的...

    Java经典编程300例(完整版+源码

    本书提供了大量的源程序、素材,提供了相关的模块库、案例库、素材库、题库等多种形式辅助学习资料,还提供迅速及时的微博、qq、论坛等技术支持。 本书内容详尽,实例丰富,非常适合作为零基础学习人员的学习用书...

    java并发编程源码

    《Java并发编程源码》是深入理解Java多线程编程技术的重要参考资料,它包含了实际案例和源代码,有助于开发者在实践中提升并发编程能力。这里主要围绕"并发"和"源码"这两个关键标签,详细讲解Java并发编程的核心知识...

    JAVA学习书籍_java案例开发集锦

    在深入探讨《JAVA学习书籍_java案例开发集锦》这一资源之前,我们首先需要理解JAVA作为一门编程语言的核心价值。JAVA,由Sun Microsystems的詹姆斯·高斯林于1995年发布,是一种广泛应用于企业级应用、移动应用、...

    Java完美编程(第三版).

    《Java完美编程(第三版)》是一本专为Java初学者和进阶者精心编写的教程,...总的来说,《Java完美编程(第三版)》是一本内容详实、涵盖广泛的Java学习指南,无论你是Java新手还是有一定经验的开发者,都能从中受益匪浅。

    Java 实效编程百例

    《Java 实效编程百例》是一本专注于Java编程实践的书籍,旨在通过丰富的实例来提升开发者在实际项目中的技能和效率。在这个压缩包中,包含了两个文件:www_sj00_com.txt和Javasjoxoambao,它们可能是书中的一些代码...

Global site tag (gtag.js) - Google Analytics