java反射调用怎样获得原来的类型

java反射调用怎样获得原来的类型,第1张

Java中要用到反射,首先就必须要获取到对应的class对象,在Java中有三种方法获取类对应的class对象。 1、通过类的class属性 2、通过类实例的getClass()方法获取

class获得的是类的class对象,可不是这个类的对象,用class

变量名接收,用这个class对象通过反射机制可以通过newinstence创建出这个类的对象而且只能调用无参数构造器

很多朋友都想知道java怎么获取泛型class?下面就一起来了解一下吧~

获取泛型Class的方法

Class类的方法:

public Type getGenericSuperclass()

方法作用:

如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。如果以前未曾创建表示超类的参数化类型,则创建这个类型。有关参数化类型创建过程的语义,请参阅 ParameterizedType 声明。如果此 Class 表示 Object 类、接口、基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。

ParameterizedType类的方法:

Type[] getActualTypeArguments()

方法作用:返回表示此类型实际类型参数的 Type 对象的数组。

注意,在某些情况下,返回的数组为空。如果此类型表示嵌套在参数化类型中的非参数化类型,则会发生这种情况。

二、获取泛型Class对象

(解析Excel的类代码较多,这里定义几个简单的类记录)

定义获取泛型Class对象的工具类

GenericSuperclassUtil

import javalangreflectParameterizedType; import javalangreflectType; public class GenericSuperclassUtil { /  获取泛型类Class对象,不是泛型类则返回null / public static Class  getActualTypeArgument(Class  clazz) { Class  entitiClass = null; Type genericSuperclass = clazzgetGenericSuperclass(); if (genericSuperclass instanceof ParameterizedType) { Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass) getActualTypeArguments(); if (actualTypeArguments != null && actualTypeArgumentslength > 0) { entitiClass = (Class ) actualTypeArguments[0]; } } return entitiClass; } }

定义BaseService ,用来测试不使用父类时泛型Class的获取

BaseService

public class BaseService  { public Class  getEntityClass() { return GenericSuperclassUtilgetActualTypeArgument(thisgetClass()); } }

测试BaseServicegetEntityClass() @Testpublic void testBaseService() { Systemoutprintln(new BaseService ()getEntityClass());// 控制台输出:null }

1、Test t = new Test()Class clazz = tgetClass()Systemoutprintln(clazzgetCanonicalName())Systemoutprintln(clazzgetSimpleName())

2、public class TestReflect {public static void main(String[] args) throws Exception {TestReflect testReflect = new TestReflect()Systemoutprintln(testReflectgetClass()getName())// 结果 netxsoftlabbaikeTestReflect}}

3、Java程序

类名class 的方式更加安全,例如当你要获取一个接口的class时,可以使用 类名class 的方式获取

但此时就不能通过 对象getClass 的方式获取了,因为接口是没有实例对象的,接口只有实现类对象,通过这种方式获取到的是接口的实现类的class,而非是接口的class

再者就是对象声明的类型未必是对象本身真正的类型,通过对象获取class容易产生混乱,因此尽量使用更加安全的方式

//泛型并没有想象中那那么强力……

//换句话说就是里面什么都能放

//判断这个列表是什么类型的并没有意义

import javautilArrayList;

import javautilList;

public class Main{

public static void printType(Object object){

if(object instanceof List){

List list=(List)object;//什么都能放

listadd(new Main());

if(!listisEmpty()){

for(Object o:list)

Systemoutprintln(ogetClass()getSimpleName());

//Systemoutprintln("object是List<String>类型");

}else{

Systemoutprintln("object是List,但是不是List<String>类型");

}

}else{

Systemoutprintln("object不是List类型");

}

}

public static void main(String[] args){

List<String> list=new ArrayList<String>();

listadd("haha");

listadd("what");

printType(list);

}

}

以上就是关于java反射调用怎样获得原来的类型全部的内容,包括:java反射调用怎样获得原来的类型、java 怎样获得一个类的当前对象、java获取泛型class等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9403418.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存