由于自己也不是特别的理解,不能做过多的解释,因为这些是问过老师做出来的,我还没有学到这里。如果有解释错误的 指出来我改正一下。见谅~(如果学到这里了,会完善)

工具类(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 结合反射、泛型、注解获取泛型对象的更多相关文章

  1. 反射应用和获取Class对象的三种方式

    一.写一个"框架",可以创建任何对象运行任何方法 1.配置文件 2.使用类加载器ClassLoader,Properties集合是可以和IO流结合使用完成读取和写入数据的集合,方法 ...

  2. java 反射,注解,泛型,内省(高级知识点)

     Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs    取得任何一个已知名称的class的内部信息, 包括 ...

  3. Java反射学习-2 - 获取Class对象的三种方式

    package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ...

  4. JAVA反射机制教程-获取类对象

    1. 什么是类对象 类对象,就是用于描述这种类,都有什么属性,什么方法的 2. 获取类对象 获取类对象有3种方式(1). Class.forName(2). Hero.class(3). new He ...

  5. java基础(反射,注解,多线程,juc)

    JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...

  6. 反射①:如何获取class对象六种方法

    获取class对象的六种方法 了解:class类——是Java反射机制的入口,封装了一个类或接口的运行信息,通过调用Class类的方法可以获取这些信息,其特点如下: 1.该类在java.lang包中: ...

  7. java利用反射将pojo转为json对象

    最近做以太坊钱包项目需要与前台进行json交互,写一个工具类,经普通javaBean转为json对象 package util; import java.lang.reflect.Field; imp ...

  8. Java中通过Class类获取Class对象的方法详解

    方式1:通过Object类的getObject()方法 Person p = new Person(); Class c = p.getClass(); 方式2: 通过 类名.class 获取到字节码 ...

  9. JavaSE学习总结(十五)—— Java反射与注解

    一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...

随机推荐

  1. HTTP的基本原理

    用户访问万维网文档,万维网文档之间的链接以及万维网文档中数据传送到用户计算机,这些功能的实现都是由超文本传输协议 HTTP(HyperTextTransfer Protocol) 负责完成的. HTT ...

  2. linux 命令 — grep

    grep 用于文本搜索,能接受文件或者stdin作为输入,能输出各种格式 grep match_pattern filename 搜索文件中出现match_pattern的行,match_patter ...

  3. mysql的"双1设置"-数据安全的关键参数(案例分享)

    mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性 ...

  4. 在Windows Server 2008 R2上安装IIS服务

    一.Windows Server 2008 R2 介绍 1.Windows Server 2008 R2 基本概念 2.Windows Server 2008 R2 家族系列 二.VMware虚拟机安 ...

  5. 【原创】使用golang访问windows telnet服务器

    本篇博客记录本次使用golang语言tcp方式进行telnet服务器访问 环境: 1.win7系统telnet服务器,使用地址:192.168.8.189 2.python使用telnetlib库对t ...

  6. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  7. SpringBoot学习(八)-->SpringBoot之过滤器、监听器

    本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener. 过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet ...

  8. IE的浏览器模式、文本模式

    最近在部署网页的时候,发现IE下的布局完成混乱. 在改变IE的文本模式后,显示就正常了. IE的浏览器模式,用于切换IE针对该网页的默认文本模式.对不同版本浏览器的条件注释解析.决定请求头里userA ...

  9. NLP入门(一)词袋模型及句子相似度

      本文作为笔者NLP入门系列文章第一篇,以后我们就要步入NLP时代.   本文将会介绍NLP中常见的词袋模型(Bag of Words)以及如何利用词袋模型来计算句子间的相似度(余弦相似度,cosi ...

  10. C#线程同步--限量使用

    问题抽象:当某一资源同一时刻允许一定数量的线程使用的时候,需要有个机制来阻塞多余的线程,直到资源再次变得可用.线程同步方案:Semaphore.SemaphoreSlim.CountdownEvent ...