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反射与注解
一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...
随机推荐
- 静态和实例方法区别-java
静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这 ...
- 在vue中使用Autoprefixed
为了使我们的项目兼容各种浏览器,我们可能会在开发中写大量的前缀.即使有了IDE为我们提供了便捷的方式.但是仍然需要我们去花时间和精力.而这样会浪费我们很多的时间.为了在开发中提升团队的开发效率,并且同 ...
- 【转载】红外遥控HS0038B接法
4.7uF电容的作用:去耦和旁路 去耦电容的主要功能就是提供一个局部的直流电源给有源器件,以减少开关噪声在板上的传播和将噪声引导到地.通常也把输出信号的干扰作为滤除对象. 旁路电容:为高频 ...
- oracle10G/11G官方迅雷下载地址合集
原文链接:https://blog.csdn.net/zlsunnan/article/details/8058235 ORACLE11GR2 Oracle Database 11g Release ...
- anoconda包管理汇总
anoconda默认的seaborn版本是0.8.1 seaborn的最新版本是0.9.0 并且已经没有0.8.1的文档了. 升级anoconda的seaborn版本 进入anoconda prom ...
- BurpSuite 各模块使用
Proxy 代理 对浏览器进行代理 对浏览器增加代理服务器 可以对http 请求进行监视 intercept is on 进行监控 off 不监控 可以任意修改 对任意的网络请求 进行爬虫 在 s ...
- C#中设置窗口在最前显示而其他窗口不能使用
对程序中的一个Form1处理,让其在打开的情况下,其他窗体都无法使用,全部焦点都在他身上. 1.这种方法最简单,直接调用窗体的模态对话框函数显示窗体 Form1.ShowDialog(): 2.设置窗 ...
- C-Linux_毫秒级随机值获取
秒级随机值-常用方法: #include <stdlib.h> #include <stdio.h> #include <stdio.h> #include < ...
- MyBatis:Pagehelper分页
对于分页插件这里选择查询所有用户的信息,以列表返回 前端只需输入分页数的数据既可 service实现类也很方便,甚至我都开始有点喜欢上这种Example的SQL形式了. 最后页面调用url的json信 ...
- Java-this
当方法中的参数和类中变量重名时,使用 this.变量 调用成员变量. public class test1 { String name; int age; public void te(String ...