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

工具类(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. 静态和实例方法区别-java

    静态方法和实例方法的区别主要体现在两个方面:   在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这 ...

  2. 在vue中使用Autoprefixed

    为了使我们的项目兼容各种浏览器,我们可能会在开发中写大量的前缀.即使有了IDE为我们提供了便捷的方式.但是仍然需要我们去花时间和精力.而这样会浪费我们很多的时间.为了在开发中提升团队的开发效率,并且同 ...

  3. 【转载】红外遥控HS0038B接法

        4.7uF电容的作用:去耦和旁路   去耦电容的主要功能就是提供一个局部的直流电源给有源器件,以减少开关噪声在板上的传播和将噪声引导到地.通常也把输出信号的干扰作为滤除对象. 旁路电容:为高频 ...

  4. oracle10G/11G官方迅雷下载地址合集

    原文链接:https://blog.csdn.net/zlsunnan/article/details/8058235 ORACLE11GR2 Oracle Database 11g Release ...

  5. anoconda包管理汇总

    anoconda默认的seaborn版本是0.8.1 seaborn的最新版本是0.9.0  并且已经没有0.8.1的文档了. 升级anoconda的seaborn版本 进入anoconda prom ...

  6. BurpSuite 各模块使用

    Proxy  代理 对浏览器进行代理 对浏览器增加代理服务器 可以对http 请求进行监视 intercept is on 进行监控  off 不监控 可以任意修改 对任意的网络请求 进行爬虫 在 s ...

  7. C#中设置窗口在最前显示而其他窗口不能使用

    对程序中的一个Form1处理,让其在打开的情况下,其他窗体都无法使用,全部焦点都在他身上. 1.这种方法最简单,直接调用窗体的模态对话框函数显示窗体 Form1.ShowDialog(): 2.设置窗 ...

  8. C-Linux_毫秒级随机值获取

    秒级随机值-常用方法: #include <stdlib.h> #include <stdio.h> #include <stdio.h> #include < ...

  9. MyBatis:Pagehelper分页

    对于分页插件这里选择查询所有用户的信息,以列表返回 前端只需输入分页数的数据既可 service实现类也很方便,甚至我都开始有点喜欢上这种Example的SQL形式了. 最后页面调用url的json信 ...

  10. Java-this

    当方法中的参数和类中变量重名时,使用  this.变量 调用成员变量. public class test1 { String name; int age; public void te(String ...