016、Java泛型实例化
本文最后更新于 422 天前,其中的信息可能已经过时,如有错误请发送邮件到 wuxianglongblog@163.com

Java 泛型实例化

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

//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 block
e.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)的直接超类的 Type
Type 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);
}
}
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇