`
421728862
  • 浏览: 8500 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

java注解和反射示例

 
阅读更多
最近做项目中有接触到反射的使用简单的做了一个注释

首先的想法是根据类中不为空的值生成sql

 

首先是三个注解

主键注解

package comments;

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;

/**
 * 主键
 * @author  Administrator
 */
@Target(ElementType.FIELD)   
@Retention(RetentionPolicy.RUNTIME)   
@Documented  
@Inherited 
public @interface  Key {
}
package comments;

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;

/**
 * 如果不和数据关联则设置此注解
 * @author  Administrator
 *
 */
@Target(ElementType.FIELD)   
@Retention(RetentionPolicy.RUNTIME)   
@Documented  
@Inherited 
public @interface  notRecord {
}
package comments;

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;

/**
 * 设置表名
 * @author  Administrator
 *
 */
@Target(ElementType.TYPE)   
@Retention(RetentionPolicy.RUNTIME)   
@Documented  
@Inherited 
public @interface  Table {
	public String name();
}
然后是自定义异常类
package org;

/**
 * 设置自定义异常
 * @author  Administrator
 *
 */
public class NumException extends Exception {
	private String name;
	public NumException(String name){
		this.name=name;
	}
	public String toString(){
		  return name;
	}
}
实体类
package org;

import comments.Key;
import comments.Table;
import comments.notRecord;

@Table(name = "student")
public class Student {
	@Key 
	private String id;
	private String name;
	@notRecord
	private String sex;
	private int age;

	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;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}
处理实体类生成sql的类。
package org;

import java.lang.reflect.Field;

import comments.Key;
import comments.Table;
import comments.notRecord;

public class Processing {
	
	/**
	 * 通过实体类生成 insert into sql语句
	 * @param cl
	 * @return 
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws NumException
	 */
	public String save(Object cl) throws IllegalArgumentException, IllegalAccessException, NumException{
		String sql="insert into ";
		if(cl!=null){
			Field[] fiels=cl.getClass().getDeclaredFields();//获得反射对象集合
			boolean t=cl.getClass().isAnnotationPresent(Table.class);//获得类是否有注解
			if(t){
				Table tab=cl.getClass().getAnnotation(Table.class);
				sql+=tab.name();//获得表名
				String name ="";//记录字段名
				String value ="";//记录值名称
				boolean bl=false;//记录主键是否为空
				for(Field fl:fiels){//循环组装
					fl.setAccessible(true);//开启支私有变量的访问权限
					Object tobj=fl.get(cl);
					if(tobj!=null){
						if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
							bl=true;
						}
						if(!fl.isAnnotationPresent(notRecord.class)){
							name+=fl.getName()+",";
							value+="'"+tobj.toString()+"',";
						}
					}
				}
				if(bl){
					if(name.length()>0)
						name=name.substring(0,name.length()-1);
					if(value.length()>0)
						value=value.substring(0,value.length()-1);
					sql+="("+name+") values("+value+")";
				}else
					throw new NumException("未找到类主键 主键不能为空");
			}else
				throw new NumException("传入对象不是实体类");
		}else
			 throw new NumException("传入对象不能为空");//抛出异常
		return sql;
	}
	/**
	 * 传入对象更新
	 * @param obj
	 * @return 
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws NumException
	 */
	public String update(Object obj) throws IllegalArgumentException, IllegalAccessException, NumException{
		String sql="update ";
		if(obj!=null){
			Field[] fiels=obj.getClass().getDeclaredFields();//获得反射对象集合
			boolean t=obj.getClass().isAnnotationPresent(Table.class);//获得类是否有注解
			if(t){
				Table tab=obj.getClass().getAnnotation(Table.class);
				sql+=tab.name()+" set ";//获得表名
				String wh ="";//记录字段名
				String k="";
				boolean bl=false;//记录主键是否为空
				for(Field fl:fiels){//循环组装
					fl.setAccessible(true);//开启支私有变量的访问权限
					Object tobj=fl.get(obj);
					if(tobj!=null){
						if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
							bl=true;
							k=fl.getName()+"='"+tobj.toString()+"' where  ";
						}else{
							if(!fl.isAnnotationPresent(notRecord.class)){
								wh+=fl.getName()+"='"+tobj.toString()+"',";
							}
						}
					}
				}
				if(bl){
					if(wh.length()>0)
						wh=wh.substring(0,wh.length()-1);
					if(k.length()>0)
						k=k.substring(0,k.length()-1);
					sql+=k+wh;
				}else
					throw new NumException("未找到类主键 主键不能为空");
			}else
				throw new NumException("传入对象不是实体类");
		}else
			 throw new NumException("传入对象不能为空");//抛出异常
		return sql;
	}
}
 

最后是测试类

package org;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import comments.Table;
import comments.Key;

public class temp {
	public static void main(String[] aa) throws IllegalArgumentException, IllegalAccessException, NumException{
		Student stu=new Student();
		stu.setId("ccc");
		stu.setName("姓名");
		stu.setAge(18);
		stu.setSex("男");
		//stu=null;
		System.out.println(new Processing().save(stu));
		System.out.println(new Processing().update(stu));
	}
}

 

分享到:
评论

相关推荐

    java注解和反射的12个demo.zip

    本压缩包“java注解和反射的12个demo.zip”中,可能包含以下示例: 1. **注解的创建与使用**:展示如何自定义注解以及如何在代码中使用这些注解。 2. **元注解的运用**:例如`@Retention`、`@Target`等元注解的使用...

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    在Java编程中,注解...这个示例涵盖了Java中使用反射获取注解的基本操作,包括类、方法、注解的值和方法参数。通过实践这个例子,你可以更好地理解和掌握这些概念,从而在实际项目中更有效地利用注解和反射。

    JAVA 注解和反射.7z

    总结,Java注解和反射是Java开发中非常重要的技术,它们极大地增强了Java的灵活性和可扩展性。注解简化了代码,提供了元数据,而反射则允许程序在运行时探索和修改自身的结构,两者共同推动了Java的广泛应用。了解并...

    入门级java 注解学习示例代码

    以上就是关于Java注解的基本概念、使用和自定义方法。在实际开发中,注解广泛应用于Spring框架、ORM框架如Hibernate等,极大地简化了代码,提高了可维护性和可扩展性。学习和掌握注解是提升Java编程技能的重要一环。

    JAVA 注解示例 详解

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器或JVM提供附加信息的方式。这些信息可以用于代码分析、编译时检查或运行时处理。...因此,学习和掌握Java注解对于提升开发效率至关重要。

    java自定义注解和通过反射获取注解

    Java自定义注解和通过反射获取注解是Java编程中重要的高级特性,它们极大地增强了代码的可读性和可维护性。注解(Annotation)是一种元数据,提供了在编译时和运行时对代码进行标记的方法,而反射(Reflection)则是...

    Android-注解与反射注解知识点反射知识点注解java反射

    在Java中,注解分为保留期注解(如@Override、@Deprecated)、编译器注解(用于编译时检查)和运行时注解(可以在运行时通过反射获取)。 2. **自定义注解**:开发者可以通过`@interface`关键字自定义注解,定义...

    Java使用注解和反射简化编程的方法示例

    Java使用注解和反射简化编程的方法示例 Java中的注解和反射机制可以简化编程的方式,提高编程效率。下面将通过实例形式,分析Java使用注解和反射简化编程的相关操作技巧。 Java中的注解是一种meta信息,提供了...

    java反射示例代码

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在Java中,反射主要用于以下场景:代码生成、元数据访问、插件系统、框架设计等。...

    注解+反射实现自定义验证工具,可实现业务校验,字段多种校验

    本文介绍了一种利用Java中的注解和反射技术来实现自定义验证工具的方法,该方法可以极大地提高代码的灵活性和可维护性。 #### 二、自定义验证工具设计思路 ##### 2.1 总体设计 本验证工具的核心思想是通过定义一...

    java 反射ppt 和 code 示例

    在“java 反射ppt 和 code 示例”中,我们可以深入理解这个强大的工具及其在实际开发中的应用。 首先,PPT部分可能会涵盖以下知识点: 1. **反射基本概念**:解释什么是反射,它的作用以及为什么我们需要它。反射...

    Java基础之注解+反射.docx

    Java注解和反射是Java编程中的两个重要概念,它们提供了强大的元数据管理和动态代码执行能力。注解(Annotation)是一种元编程技术,用于在代码中插入额外的信息,这些信息可以在编译时或运行时被解析和利用。反射...

    java 注解annotation的使用以及反射如何获取注解

    Java注解(Annotation)是Java语言提供的一种元数据机制,用于向编译器或JVM提供额外的信息。这些信息可以用来验证代码、控制代码生成、配置应用等。注解是自Java 5版本引入的特性,它使得程序员可以在源代码中嵌入...

    注解javademo演示

    Java注解,也被称为元数据,是Java编程语言中的一个重要特性,它允许程序员在源代码中插入一些附加信息。这些信息可以被编译器或...通过阅读给定的博客和分析压缩包中的示例,你可以更深入地了解Java注解的用法和实践。

    Java 使用注解拼接SQL语句

    在Java中,我们可以使用反射API或者AOP(面向切面编程)来处理注解。例如,我们可以创建一个切面,该切面会在方法调用前/后检查是否有`@Query`注解,并根据注解中的SQL模板执行数据库操作。 3. **动态SQL**: 使用...

    Java注解的使用例子

    总的来说,Java注解为软件开发带来了更丰富的元数据功能,使代码更易于理解和维护,同时也方便了工具和框架对代码的处理。这个例子展示了如何创建、使用注解,以及如何通过Ant构建和运行包含注解的程序。

    java通用注解API

    通过阅读《Java通用注解和API规范.pdf》这份文档,你可以更深入地理解Java注解的原理、使用方法以及最佳实践,从而在实际开发中更好地利用这一强大的工具。这份文档涵盖了从基础概念到高级特性的全面内容,对于Java...

    java 注解开发(包含详细注释,项目可以直接运行)

    Java注解是自JDK1.5版本...通过学习和运行这些示例,你可以更深入地理解Java注解的使用方式和它们在实际项目中的应用。对于初学者,这是一个很好的实践资源,对于有经验的开发者,这些示例也可以作为快速参考和回顾。

    java反射机制+代码示例

    Java反射机制是Java编程语言中...通过实际的代码示例,学习和理解Java反射机制将变得更加直观和深入。在实际开发中,反射常用于框架、插件系统、序列化/反序列化、测试等方面,但也需要谨慎使用,避免过度依赖和滥用。

    Java注解学习

    Java注解为代码提供了额外的维度,它们不仅是代码的补充说明,更是现代软件开发中不可或缺的一部分,用于自动化任务、增强框架功能和提高代码质量。理解和熟练运用注解是Java开发者的一项重要技能。

Global site tag (gtag.js) - Google Analytics