使用getGenericSuperclass()和getActualTypeArguments()将DAO做成泛型

一、getGenericSuperclass()和getActualTypeArguments()基本用法:

import java.lang.reflect.ParameterizedType;

public class TT extends TT2<Integer> {

public static void main(String[] args) {

System.out.println(((ParameterizedType) new TT().getClass()

.getGenericSuperclass()).getActualTypeArguments()[0]);

}

}

//output:class java.lang.Integer

说明: getGenericSuperclass() 通过反射获取当前类表示的实体(类,接口,基本类型或void)的直接父类的Type,getActualTypeArguments()返回参数数组。

二、泛型 DAO 模拟

BaseDaoImpl类:

package com.mrlun.oa.test;

import java.lang.reflect.ParameterizedType;

@SuppressWarnings("unchecked")

public class BaseDaoImpl<T> {

private Class clazz;

public BaseDaoImpl() {

ParameterizedType pt = (ParameterizedType) this.getClass()

.getGenericSuperclass();

this.clazz = (Class) pt.getActualTypeArguments()[0];

System.out.println("Type为: " + clazz.getSimpleName());

}

public void save() {

System.out.println("Type为: " + clazz.getSimpleName());

}

}

UserDao类:

package com.mrlun.oa.test;

public class UserDao extends BaseDaoImpl<Users>{

}

测试类:

package com.mrlun.oa.test;

public class Test{

public static void main(String[] args) {

UserDao userdao=new UserDao();

userdao.save();

}

}

//output:

Type为: Users(new 子类时会调用父类的默认的构造方法)

Type为: Users

这时,我们就可以使用泛型来简化DAO的操作,省去了写N多有重复的方法的DAO的时间。

时间: 2024-10-10 13:48:00

使用getGenericSuperclass()和getActualTypeArguments()将DAO做成泛型的相关文章

Android 使用ORMLite打造万能泛型Dao简化数据持久化层

前面的一篇文章Android ORM系列之ActiveAndroid 介绍了ActiveAndroid的使用方法,但是ActiveAndroid有一个很明显的缺点,就是所有的实体类必须继承Model类才能进行CRUD,这是典型的php中的ActiveRecord方式的数据库操作.这时候我们会想一下,在Java Web中,hibernate或者mybatis就很好,其实在android中也有这么一个框架,但是这个框架是java的,只不过它支持Android而已,它就是ORMLite.这篇文章不会过

Java基础---泛型、集合框架工具类:collections和Arrays

第一讲     泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类型的数据,无法加入指定类型以外的数据. 3.泛型是提供给javac编译器使用的可以限定集合中的输入类型说明的集合时,会去掉“类型”信息,使程序运行效率不受影响,对参数化的泛型类型,getClass()方法的返回值和原始类型完全一样. 4.由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就

Java泛型之Type体系

Type是java类型信息体系中的顶级接口,其中Class就是Type的一个直接实现类.此外,Type还有有四个直接子接口:ParameterizedType,TypeVariable,WildcardType,GenericArrayType. 引用这位仁兄对这几个接口的介绍:       Type    它是所有类型的公共接口.包括原始类型.参数化类型.数组类型.类型变量和基本类型.ParameterizedType, TypeVariable, WildcardType,GenericAr

父类通过泛型获得子类Class类型 以及Type体系

1.背景介绍 在实现SSH框架中,DAO层向数据库持久化的过程中,因为大部分保存对象的方法都会调用到sava():所有索性就把save delete update select 方法进行封装到父类中,这时候就遇到了个问题,子类在调用这些方法的时候,需要根据子类的类型获知子类Class类型:这个时候可以通过传入泛型,根据泛型的类型来获取子类的Class类型:  2.实现代码范例 父类:public abstract class Parents<E> { private Class<?>

父类如何获取子类传递的泛型

权声明:本文为博主原创文章,未经博主允许不得转载. package com.reflect.other; import java.io.Serializable; /** * 简单pojo类(测试用,无具体意义) * * @author edgewalk * @date 2017年6月5日 */ public class Person implements Serializable { private static final long serialVersionUID = 1L; privat

泛型转换https://www.cnblogs.com/eason-chan/p/3633210.html

import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;//总结1.st.getClass==Student.class//对象(实体)的class类型//   2.st.getClass().getSuperclass()--获得实体st类的夫类//   3.st.getClass().getGenericSuperclass()--获得实体st类带有泛型的夫类//   4.st.getClass().g

getSuperclass与getGenericSuperclass的区别。

如: class B extends A<User>{ ... } B.getClass.getSuperclass得到的结果是A 而 B.getClass.getGenericSuperclass得到的结果是A<User> 即getGenericSuperclass得到的父类是带泛型的,而getSuperclass不带泛型 ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGe

java 反射操作泛型

public class emm { public void test01(Map<String,User>map,List<User>list) { System.out.println("test01"); } public Map<String,User> test02() { System.out.println("test02"); return null; } public static void main(Strin

编程实践积累

1 编程经验实践,积累,总结,分享 2 3 4 博客地址:http://www.cnblogs.com/liaowanzhong/ 5 6 7 8 9 10 11 12 13 14 15 1. 大量群发邮件:购买Edm服务,大的互联网企业是和邮箱服务商签订协议(百度,腾讯,京东,阿里,csdn) 16 站内信 17 内网发短信:短信猫 18 19 2. Servlet Filter 生命周期 20 *Servlet:看配置文件中web.xml配置其启动的优先级别,即当load-on-startu