实例化具有无参数构造函数的泛型对象

//newInstance() method need constructor without parameter
//Class<T> come form Class.class
public <T> T getNewObject(Class<T> cls) {T t=null;try {t = cls.newInstance();} catch (InstantiationException|IllegalAccessException e) {e.printStackTrace();}return t;
}

调用

String i =getNewObject(String.class);

这种方法需要泛型类具有一个无参数构造函数

实例化没有无参数构造函数的泛型对象

//newInstance() method need constructor with parameter
public <T> T getNewObject(Constructor<T> cls, double d) {T t = null;try {t = cls.newInstance(d);} catch (InstantiationException | IllegalAccessException| IllegalArgumentException | InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}return t;
}

调用

con = Float.class.getConstructor(double.class);
Float k =getNewObject(con,10.0);

这种方法先确定使用泛型类的哪一个构造函数,再通过该构造函数newInstance实例出来。

通用的实例泛型对象(无需区别是否有无参数构造函数)

通过反射动态创建泛型实例

public class BasePresenter<V extends BaseView,M extends BaseModel>{private M mModel;public void attach(){//1、返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 TypeType genType = getClass().getGenericSuperclass();//2、泛型参数Type[] types = ((ParameterizedType) genType).getActualTypeArguments();//3、因为BasePresenter 有两个泛型 数组有两个try {//mModel= (M) ((Class)types[1]).newInstance();//这里需要强转得到的是实体类类路径
//            如果types[1].getClass().newInstance();并不行,得到的是泛型类型} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}public M getModel(){return mModel;}}

getSuperclass和 getGenericSuperclass的区别

  • getSuperclass返回直接继承的父类不包括泛型参数
  • getGenericSuperclass返回直接继承的父类包含泛型参数

getInterfaces 和 getGenericInterface 的区别

  • getInterfaces 返回直接实现的接口(不显示泛型参数)
  • getGenericInterface 返回直接实现的接口(显示泛型参数)

封装成工具类

public class ReflectionUtil {/*** 通过type获取className*/public static String getClassName(Type type){if(type==null){return "";}String className = type.toString();if (className.startsWith("class")){className=className.substring("class".length());}return className;}/*** 获取子类在父类传入的泛型Class类型* 获取泛型对象的泛型化参数* @param o* @return*/public static Type getParameterizedTypes(Object o){Type superclass = o.getClass().getGenericSuperclass();if(!ParameterizedType.class.isAssignableFrom(superclass.getClass())) {return null;}Type[] types = ((ParameterizedType) superclass).getActualTypeArguments();return types[0];}/*** 获取实现类的泛型参数* @param o* @return*/public static Type getInterfaceTypes(Object o){Type[] genericInterfaces = o.getClass().getGenericInterfaces();return genericInterfaces[0];}/***检查对象是否存在默认构造函数*/public static boolean hasDefaultConstructor(Class<?> clazz) throws SecurityException {Class<?>[] empty = {};try {clazz.getConstructor(empty);} catch (NoSuchMethodException e) {return false;}return true;}/*** 通过Type创建对象*/public static Object newInstance(Type type)throws ClassNotFoundException, InstantiationException, IllegalAccessException {Class<?> clazz = getClass(type);if (clazz==null) {return null;}return clazz.newInstance();}/*** 通过Type获取对象class* @param type* @return* @throws ClassNotFoundException*/public static Class<?> getClass(Type type)throws ClassNotFoundException {String className = getClassName(type);if (className==null || className.isEmpty()) {return null;}return Class.forName(className);}}

【JAVASE】Java泛型实例化相关推荐

  1. java泛型实例化_java基础-泛型举例详解

    泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...

  2. JAVA泛型实例化代码

    ParameterizedType ptype = (ParameterizedType) this.getClass().getGenericSuperclass();Class clazz = ( ...

  3. java泛型实例化_如何实例化泛型spring bean?

    我想创建一个泛型类,它将帮助我减少样板代码.我正在使用Spring 3(MVC)和Hibernate 4.如何实例化泛型spring bean? 类看起来是这样的: @Repository(" ...

  4. java 泛型方法 实例化_Java让泛型实例化的方法

    泛型对象可以实例化吗? 不可以,T t=new T()是不可以的,编译器会报错.由于泛型擦除,编译器在编译时无法确定泛型所对应的真实类型 解决方法 使用反射新建实例 Type superclass = ...

  5. Java泛型06 : 通配符:上边界、下边界与无界

    超级通道: Java泛型学习系列-绪论 本章主要对Java泛型的通配符进行说明. 1.概念简介 在Java泛型定义时: 用<T>等大写字母标识泛型类型,用于表示未知类型. 用<T e ...

  6. java new 删除吗,java泛型对象初始化-java泛型对象会实例化吗T t=new T()

    java泛型对象初始化--java泛型对象能实例化吗T t=new T() java中没法得到泛型参数化类型,因为在编译期没法确定泛型参数化类型,也就找不到对应的类字节码文件,自然就不行了 泛型反射的 ...

  7. java泛型程序设计——Varargs 警告+不能实例化类型变量

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 Varargs 警告+不能实例化类型变量 的知识: [1] Vara ...

  8. 是清单 Dog List的子类 Animal ? 为什么Java泛型不是隐式多态的?

    我对Java泛型如何处理继承/多态感到困惑. 假设以下层次结构- 动物 (父母) 狗 - 猫 (儿童) 因此,假设我有一个方法doSomething(List<Animal> animal ...

  9. 深入理解 Java 泛型

    首先提个问题: Java 泛型的作用是什么?泛型擦除是什么?泛型一般用在什么场景? 如果这个问题你答不上来,那这篇文章可能就对你有些价值. 读完本文你将了解到: 什么是泛型 为什么引入泛型 泛型的使用 ...

最新文章

  1. 用 Python 拓展 GDB(三)
  2. 6.2、Android Studio内存
  3. 关于css浮动的一点思考
  4. 分布式消息队列 Kafka
  5. 【MATLAB统计分析与应用100】案例001:matlab使用Importdata函数导入文本txt数据
  6. mysql innodb_sort_buffer_size_mysql优化---第7篇:参数 innodb_buffer_pool_instances设置
  7. oracle中xml如何存储过程,oracle存储过程生成xml文件
  8. ssh xm 工具_比较一下几款常用的SSH工具
  9. Oracle 19c 新特性:ADG的自动DML重定向增强读写分离
  10. 新版仿山楂岛留言PHP源码+短视频/公众号吸粉引流
  11. Tungsten Fabric入门宝典丨TF组件的七种“武器”
  12. QQ通信原理及QQ是怎么穿透内网进行通信的?
  13. Linux 系统安装后优化项常见操作
  14. 康特EPON OLT开局配置
  15. Microsoft office 2007 word PPT 转pdf的插件
  16. CUDA:CUDA内核中内联PTX(汇编语言)用法的实例
  17. Nginx sendfile作用
  18. 耳机主动降噪技术ANC理解
  19. 最值得推荐的8个手机(华为、小米、OPPO、Vivo等)数据恢复软件
  20. RPC服务和HTTP服务对比

热门文章

  1. 只需20分钟,免费搭建你的个人网站!
  2. 无法安装或运行此应用程序。该应用程序要求首先在“全局程序集缓存(GAC)中安装程序集MySQL版本6.7.4”
  3. 北京大学计算机专业保研夏令营,北京大学12院系办夏令营 优秀者可保研
  4. Java安卓如何添加悬浮窗_Android桌面悬浮窗效果实现
  5. 汇编原理自我总结 (二)
  6. 「高效程序员的修炼」快速上手python主流测试框架pytest以及单元测试编写
  7. Ubuntu 16.04下Intel SGX SDK环境搭建(硬件不支持情况)
  8. 【三维路径规划】基于matlab复杂三维地形的无人机路径规划【含Matlab源码 2171期】
  9. Python的lambda函数与排序
  10. 北大双杰——孔庆东和余杰