java 结合反射、泛型、注解获取泛型对象
由于自己也不是特别的理解,不能做过多的解释,因为这些是问过老师做出来的,我还没有学到这里。如果有解释错误的 指出来我改正一下。见谅~(如果学到这里了,会完善)
工具类(SQLUtil)核心代码:
package edu.nf.homeWork.utils; import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; public class SQLUtil { /**
*
* @param sql Sql查询语句
* @param clazz 泛型class
* @param params 参数值
* @return 泛型对象
* @throws RuntimeException
*/
public static <T> T execute(String sql, Class<T> clazz, Object...params)throws RuntimeException {
try {
//获取连接对象
Connection conn = DBUtil.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
ps = conn.prepareStatement(sql);
//循环遍历把参数插入数据库
for (int i=1; i<=params.length; i++) {
ps.setObject(i, params[i-1]);
}
rs = ps.executeQuery();
//调用getBean方法
T instance = getBean(rs, clazz);
return instance;
} catch (Exception e) {
throw new RuntimeException();
}
}
/**
*
* @param rs 结果集
* @param clazz 泛型class
* @return 返回一个泛型对象
* @throws RuntimeException
*/
public static <T> T getBean(ResultSet rs, Class<T> clazz) throws RuntimeException {
try {
//实例化对象
Object instance = clazz.newInstance();
//获取对象的所有属性(字段)
Field[] fields = clazz.getDeclaredFields();
rs.next();
for (Field field : fields) {
//属性对应的注解
if(field.isAnnotationPresent(Column.class)) {
//获取对应的值
String columnName = field.getAnnotation(Column.class).value();
Object o = rs.getObject(columnName);
field.setAccessible(true);
field.set(instance, o);
}
}
//强转泛型对象
return (T)instance;
} catch (Exception e) {
throw new RuntimeException();
}
}
}
用注解绑定实体类(Users):
package edu.nf.homeWork.utils; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column { String value();
}
实体类(Users):
package edu.nf.homeWork.entity;
import edu.nf.homeWork.utils.Column;
public class Users {
//用注解绑定数据库里面的列
@Column("useName")
private String userName;
@Column("passwords")
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Users [userName=" + userName + ", password=" + password + "]";
}
}
查询单个用户的信息的方法
/**
* 查询单个用户的信息
* @param userName
* @param passWord
* @return
*/
public Users findUser(String userName,String passWord) {
//sql查询语句
String sql="select *from useinfo where usename=? and passwords=?";
//调用工具类返回反省对象
//参数:传入SQL语句 Users类 后面两个参数值
Users users = SQLUtil.execute(sql, Users.class, userName, passWord);
return users;
}
main方法执行
public static void main(String[] args) {
UserDao dao = new UserDao();
//调用查询方法
Users u = dao.findUser("11", "11");
//显示账号
System.out.println("账号:"+u.getUserName());
}
//输出结果:
账号:11
java 结合反射、泛型、注解获取泛型对象的更多相关文章
- 反射应用和获取Class对象的三种方式
一.写一个"框架",可以创建任何对象运行任何方法 1.配置文件 2.使用类加载器ClassLoader,Properties集合是可以和IO流结合使用完成读取和写入数据的集合,方法 ...
- java 反射,注解,泛型,内省(高级知识点)
Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs 取得任何一个已知名称的class的内部信息, 包括 ...
- Java反射学习-2 - 获取Class对象的三种方式
package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ...
- JAVA反射机制教程-获取类对象
1. 什么是类对象 类对象,就是用于描述这种类,都有什么属性,什么方法的 2. 获取类对象 获取类对象有3种方式(1). Class.forName(2). Hero.class(3). new He ...
- java基础(反射,注解,多线程,juc)
JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...
- 反射①:如何获取class对象六种方法
获取class对象的六种方法 了解:class类——是Java反射机制的入口,封装了一个类或接口的运行信息,通过调用Class类的方法可以获取这些信息,其特点如下: 1.该类在java.lang包中: ...
- java利用反射将pojo转为json对象
最近做以太坊钱包项目需要与前台进行json交互,写一个工具类,经普通javaBean转为json对象 package util; import java.lang.reflect.Field; imp ...
- Java中通过Class类获取Class对象的方法详解
方式1:通过Object类的getObject()方法 Person p = new Person(); Class c = p.getClass(); 方式2: 通过 类名.class 获取到字节码 ...
- JavaSE学习总结(十五)—— Java反射与注解
一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...
随机推荐
- 如何提升JavaScript的任务效率?学会后教给你同事
本文由云+社区发表 一.概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事.前面的任务没做完,后面的任务只能等着.随着电脑计算能力的增强,尤其 ...
- mysql字符串查找(统计客源)
如客源状态为1:2:3:5:6:9,其中6代表成交状态 如果要统计查询出有6这个状态的客源,可以用函数LOCATE(字符,搜索的字符串)来, 示例:统计每个分组下全部客源数total,成交客源数dea ...
- MySQL小计
判断不等于某一个数字的时候,数据表为空的字段不参与比较: 判断字段为空用 is null
- [JavaScript] XMLHttpRequest记录
XMLHttpRequest 使用 XMLHttpRequest 对象可以和服务器进行交互,可以获取到数据,而无需让整个页面进行刷新.这样 web 页面可以做到只更新局部页面,降低了对用户操作的影响. ...
- iOS SQLite详解
这周比较忙,前几天都加班到11点左右,基本都是到家都是12点左右(稍稍的抱怨一下,免费加班,何为免费,就是任何补偿都没有,例如调休,加班薪,餐补等各项福利,是一点都没有呀)因为App要上线了!App上 ...
- [转]How To Send Transactional Email In A NodeJS App Using The Mailgun API
https://www.npmjs.com/package/mailgun-js 本文转自:https://www.mailgun.com/blog/how-to-send-transactional ...
- 44.Linux君正X1000-添加st7789v显示
由于板子LCD旧屏是ili9335型号的,旧屏有时候会断货,如果断货则使用一个st7789v型号的LCD 它们两个屏的区别在于初始化屏的参数不同,引脚都一样,也就是说需要使板子同时支持ili9335型 ...
- 【Spring】31、Spring的EL表达式
一.简介 Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用JD ...
- Java岗 面试考点精讲(网络篇03期)
1. OSI七层模型 总结一下: 应用用层按协议打包数据 由传输层加上双方的端口号 由网络层加上双方的IP地址 由链路层加上双方的MAC地址,并将数据拆分成数据帧 数模信号转换并由物理层传输到另一端 ...
- intellij error updating changes svn解决办法
乌龟检出的svn版本为1.8,而1.8在IntelliJ 上跑起来貌似有问题, 经过多次尝试,当Format改为1.7后,问题被解决.