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反射与注解
一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...
随机推荐
- HTTP的基本原理
用户访问万维网文档,万维网文档之间的链接以及万维网文档中数据传送到用户计算机,这些功能的实现都是由超文本传输协议 HTTP(HyperTextTransfer Protocol) 负责完成的. HTT ...
- linux 命令 — grep
grep 用于文本搜索,能接受文件或者stdin作为输入,能输出各种格式 grep match_pattern filename 搜索文件中出现match_pattern的行,match_patter ...
- mysql的"双1设置"-数据安全的关键参数(案例分享)
mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性 ...
- 在Windows Server 2008 R2上安装IIS服务
一.Windows Server 2008 R2 介绍 1.Windows Server 2008 R2 基本概念 2.Windows Server 2008 R2 家族系列 二.VMware虚拟机安 ...
- 【原创】使用golang访问windows telnet服务器
本篇博客记录本次使用golang语言tcp方式进行telnet服务器访问 环境: 1.win7系统telnet服务器,使用地址:192.168.8.189 2.python使用telnetlib库对t ...
- Java设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
- SpringBoot学习(八)-->SpringBoot之过滤器、监听器
本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener. 过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet ...
- IE的浏览器模式、文本模式
最近在部署网页的时候,发现IE下的布局完成混乱. 在改变IE的文本模式后,显示就正常了. IE的浏览器模式,用于切换IE针对该网页的默认文本模式.对不同版本浏览器的条件注释解析.决定请求头里userA ...
- NLP入门(一)词袋模型及句子相似度
本文作为笔者NLP入门系列文章第一篇,以后我们就要步入NLP时代. 本文将会介绍NLP中常见的词袋模型(Bag of Words)以及如何利用词袋模型来计算句子间的相似度(余弦相似度,cosi ...
- C#线程同步--限量使用
问题抽象:当某一资源同一时刻允许一定数量的线程使用的时候,需要有个机制来阻塞多余的线程,直到资源再次变得可用.线程同步方案:Semaphore.SemaphoreSlim.CountdownEvent ...