最近做项目中有接触到反射的使用简单的做了一个注释 首先的想法是根据类中不为空的值生成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”中,可能包含以下示例: 1. **注解的创建与使用**:展示如何自定义注解以及如何在代码中使用这些注解。 2. **元注解的运用**:例如`@Retention`、`@Target`等元注解的使用...
在Java编程中,注解...这个示例涵盖了Java中使用反射获取注解的基本操作,包括类、方法、注解的值和方法参数。通过实践这个例子,你可以更好地理解和掌握这些概念,从而在实际项目中更有效地利用注解和反射。
总结,Java注解和反射是Java开发中非常重要的技术,它们极大地增强了Java的灵活性和可扩展性。注解简化了代码,提供了元数据,而反射则允许程序在运行时探索和修改自身的结构,两者共同推动了Java的广泛应用。了解并...
以上就是关于Java注解的基本概念、使用和自定义方法。在实际开发中,注解广泛应用于Spring框架、ORM框架如Hibernate等,极大地简化了代码,提高了可维护性和可扩展性。学习和掌握注解是提升Java编程技能的重要一环。
在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器或JVM提供附加信息的方式。这些信息可以用于代码分析、编译时检查或运行时处理。...因此,学习和掌握Java注解对于提升开发效率至关重要。
Java自定义注解和通过反射获取注解是Java编程中重要的高级特性,它们极大地增强了代码的可读性和可维护性。注解(Annotation)是一种元数据,提供了在编译时和运行时对代码进行标记的方法,而反射(Reflection)则是...
在Java中,注解分为保留期注解(如@Override、@Deprecated)、编译器注解(用于编译时检查)和运行时注解(可以在运行时通过反射获取)。 2. **自定义注解**:开发者可以通过`@interface`关键字自定义注解,定义...
Java使用注解和反射简化编程的方法示例 Java中的注解和反射机制可以简化编程的方式,提高编程效率。下面将通过实例形式,分析Java使用注解和反射简化编程的相关操作技巧。 Java中的注解是一种meta信息,提供了...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在Java中,反射主要用于以下场景:代码生成、元数据访问、插件系统、框架设计等。...
本文介绍了一种利用Java中的注解和反射技术来实现自定义验证工具的方法,该方法可以极大地提高代码的灵活性和可维护性。 #### 二、自定义验证工具设计思路 ##### 2.1 总体设计 本验证工具的核心思想是通过定义一...
在“java 反射ppt 和 code 示例”中,我们可以深入理解这个强大的工具及其在实际开发中的应用。 首先,PPT部分可能会涵盖以下知识点: 1. **反射基本概念**:解释什么是反射,它的作用以及为什么我们需要它。反射...
Java注解和反射是Java编程中的两个重要概念,它们提供了强大的元数据管理和动态代码执行能力。注解(Annotation)是一种元编程技术,用于在代码中插入额外的信息,这些信息可以在编译时或运行时被解析和利用。反射...
Java注解(Annotation)是Java语言提供的一种元数据机制,用于向编译器或JVM提供额外的信息。这些信息可以用来验证代码、控制代码生成、配置应用等。注解是自Java 5版本引入的特性,它使得程序员可以在源代码中嵌入...
Java注解,也被称为元数据,是Java编程语言中的一个重要特性,它允许程序员在源代码中插入一些附加信息。这些信息可以被编译器或...通过阅读给定的博客和分析压缩包中的示例,你可以更深入地了解Java注解的用法和实践。
在Java中,我们可以使用反射API或者AOP(面向切面编程)来处理注解。例如,我们可以创建一个切面,该切面会在方法调用前/后检查是否有`@Query`注解,并根据注解中的SQL模板执行数据库操作。 3. **动态SQL**: 使用...
总的来说,Java注解为软件开发带来了更丰富的元数据功能,使代码更易于理解和维护,同时也方便了工具和框架对代码的处理。这个例子展示了如何创建、使用注解,以及如何通过Ant构建和运行包含注解的程序。
通过阅读《Java通用注解和API规范.pdf》这份文档,你可以更深入地理解Java注解的原理、使用方法以及最佳实践,从而在实际开发中更好地利用这一强大的工具。这份文档涵盖了从基础概念到高级特性的全面内容,对于Java...
Java注解是自JDK1.5版本...通过学习和运行这些示例,你可以更深入地理解Java注解的使用方式和它们在实际项目中的应用。对于初学者,这是一个很好的实践资源,对于有经验的开发者,这些示例也可以作为快速参考和回顾。
Java反射机制是Java编程语言中...通过实际的代码示例,学习和理解Java反射机制将变得更加直观和深入。在实际开发中,反射常用于框架、插件系统、序列化/反序列化、测试等方面,但也需要谨慎使用,避免过度依赖和滥用。
Java注解为代码提供了额外的维度,它们不仅是代码的补充说明,更是现代软件开发中不可或缺的一部分,用于自动化任务、增强框架功能和提高代码质量。理解和熟练运用注解是Java开发者的一项重要技能。