泛型的反射

泛型的反射

需求:

     设置通用方法,会用到泛型的反射技术!

反射泛型涉知识及API

例如:
Student对象     类型的表示
ParameterizedType      参数化类型的表示

Type接口    Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
 
List<String>list   =  newArrayList<String>();
     泛型集合     list
     集合元素定义 newArrayList<String>();   中的 String
     参数化类型ParameterizedType   即:“ArrayList<String>    为参数化类型

案例:

        2张表(Account/Users)同时需要“通过主键id”获取数据。

表Users对应的实体类对象

   
   
  1. package com.cn.reflect;
  2. public class Users {
  3. private int id;
  4. private String name;
  5. private String password;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public String getPassword() {
  19. return password;
  20. }
  21. public void setPassword(String password) {
  22. this.password = password;
  23. }
  24. @Override
  25. public String toString() {
  26. return "Users [id=" + id + ", name=" + name + ", password=" + password
  27. + "]";
  28. }
  29. }

表Account对应的实体类对象

   
   
  1. package com.cn.reflect;
  2. public class Account {
  3. private int id;
  4. private String accountName;
  5. private double money;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getAccountName() {
  13. return accountName;
  14. }
  15. public void setAccountName(String accountName) {
  16. this.accountName = accountName;
  17. }
  18. public double getMoney() {
  19. return money;
  20. }
  21. public void setMoney(double money) {
  22. this.money = money;
  23. }
  24. @Override
  25. public String toString() {
  26. return "Account [id=" + id + ", accountName=" + accountName
  27. + ", money=" + money + "]";
  28. }
  29. }

2张表dao的父类BaseDao写公共的方法

   
   
  1. package com.cn.reflect;
  2. import java.lang.reflect.ParameterizedType;
  3. import java.lang.reflect.Type;
  4. import java.sql.SQLException;
  5. import java.util.List;
  6. import org.apache.commons.dbutils.handlers.BeanHandler;
  7. import org.apache.commons.dbutils.handlers.BeanListHandler;
  8. import com.cn.Util.JdbcUtils;
  9. /**
  10. * 该类写公共的通用方法
  11. * @author liuzhiyong
  12. *
  13. */
  14. public class BaseDao<T> {
  15. //保存当前运行类的参数化类型中的实际类型
  16. private Class clazz;
  17. //保存当前对象对应的 表名
  18. private String tableName;
  19. //构造函数:1.获取当前运行类的参数化类型;2.获取参数化类型中的实际类型的定义(class)
  20. public BaseDao(){
  21. // this 表示当前运行类(AccountDao/UsersDao)
  22. Class<? extends BaseDao> clazz1 = this.getClass();//获取当前运行类的字节码(AccountDao/UsersDao)
  23. //获取当前运行类的父类,即为BaseDao<AccountDao/UsersDao>,其实就是“参数化类型“,ParameterizedType
  24. Type type = clazz1.getGenericSuperclass();
  25. //强转为“参数化类型”
  26. ParameterizedType pt = (ParameterizedType)type;
  27. Type[] types = pt.getActualTypeArguments();//返回表示此类型实际类型参数的 Type对象的数组。AccountDao.class/UsersDao.class
  28. //获取实际类型参数的Type对象的第一个元素:AccountDao.class/UsersDao.class
  29. clazz = (Class)types[0];
  30. //表名(与类名一样,只要获取类名就可以)
  31. tableName = clazz.getSimpleName();
  32. }
  33. /**
  34. * 根据表主键查询
  35. * @param id 主键值
  36. * @return 返回封装后的对象
  37. */
  38. public T findById(int id){
  39. /**
  40. * 1.知道了封装的对象的类型
  41. * 2.知道了表名
  42. */
  43. String sql = "select * from " + tableName + " where id = ?";
  44. try {
  45. return JdbcUtils.getQueryRunner().query(sql, new BeanHandler<T>(clazz), id);
  46. } catch (SQLException e) {
  47. throw new RuntimeException(e);
  48. }
  49. }
  50. /**
  51. * 获取表所有数据
  52. * @return
  53. */
  54. public List<T> getAll(){
  55. String sql = "select * from " + tableName;
  56. try {
  57. return JdbcUtils.getQueryRunner().query(sql, new BeanListHandler<T>(clazz));
  58. } catch (SQLException e) {
  59. throw new RuntimeException(e);
  60. }
  61. }
  62. }

UsersDao继承BaseDao

   
   
  1. package com.cn.reflect;
  2. /**
  3. * 基于分层的必要性,这个方法不可少,这里写父类没有实现的方法(个性化需求)
  4. * @author liuzhiyong
  5. *
  6. */
  7. public class UsersDao extends BaseDao<Users> {
  8. }

AccountDao继承BaseDao

   
   
  1. package com.cn.reflect;
  2. /**
  3. * 基于分层的必要性,这个方法不可少,这里写父类没有实现的方法(个性化需求)
  4. * @author liuzhiyong
  5. *
  6. */
  7. public class AccountDao extends BaseDao<Account> {
  8. }

测试类

    
    
  1. package com.cn.reflect;
  2. import java.util.List;
  3. import org.junit.Test;
  4. public class Demo1 {
  5. @Test
  6. public void test() throws Exception {
  7. AccountDao accountDao = new AccountDao();
  8. Account account = accountDao.findById(1);
  9. System.out.println(account);
  10. List<Account> accountList = accountDao.getAll();
  11. System.out.println(accountList.toString());
  12. UsersDao usersDao = new UsersDao();
  13. Users users = usersDao.findById(1);
  14. System.out.println(users);
  15. List<Users> usersList = usersDao.getAll();
  16. System.out.println(usersList.toString());
  17. }
  18. }

效果:


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值