如何获取java泛型的参数类型

如何获取java泛型的参数类型,第1张

一般可以使用反射来获取泛型参数的实际类型,以下是详细代码:

import javalangreflectField;

import javalangreflectParameterizedType;

import javalangreflectType;

import javautilMap;

public class GenericTest {

/使用反射来获取泛型信息/

private Map<String, Integer> score;

public static void main(String[] args) throws SecurityException, NoSuchFieldException {

//Class clazz = GenericTestclass;

Class<GenericTest> clazz = GenericTestclass;

//Systemoutprintln(clazz);

Field f = clazzgetDeclaredField("score");

//直接使用getType只对普通类型有效,无法取到泛型参数

Class<> a = fgetType();

Systemoutprintln("score的类型是:"+a);

//获得Field实例f的泛型类型

Type gType = fgetGenericType();

//如果gType类型是ParameterizedType的对象

if (gType instanceof ParameterizedType) {

ParameterizedType pType = (ParameterizedType) gType;

//获取原始类型

Type rType = pTypegetRawType();

Systemoutprintln("原始类型是:"+rType);

//取得泛型类型参数

Type[] tArgs = pTypegetActualTypeArguments();

Systemoutprintln("泛型类型是:");

for (int i = 0; i < tArgslength; i++) {

Systemoutprintln("第"+i+"个泛型类型是:"+tArgs[i]);

}

}else{

Systemoutprintln("获取泛型类型出错!");

}

}

}

输出结果如下:

score的类型是:interface javautilMap

原始类型是:interface javautilMap

泛型类型是:

第0个泛型类型是:class javalangString

第1个泛型类型是:class javalangInteger

从题目描述来看,题主真正想问的是“在Scala中能否在父类中获取子类的构造参数”,用反射肯定是能办到的,代码如下:

trait Base{

def getSubclassArgs = {

import scalareflectruntime{universe => ru}

val mirror = ruruntimeMirror(getClassgetClassLoader)

val currentType = mirrorclassSymbol(getClass)toType

val instanceMirror = mirrorreflect(this)

val constructor = currentTypedecl(rutermNamesCONSTRUCTOR)asMethod

val constructorParamsName = constructorparamListsflattenmap(_nametoString)

val terms = constructorParamsNamemap(name => currentTypedecl(ruTermName(name)))

val args = termsmap(term => instanceMirrorreflectField(termasTerm)get)

args

}

}

class Impl(val args: String) extends Base{}

执行结果如下:

scala> val foo = new Impl("get subclass args!")

foo: Impl = Impl@5f0bf0ed

scala> foogetSubclassArgs

res2: List[Any] = List(get subclass args!)

这里有一点不那么舒服的地方是Impl的构造参数必须加上val或者var,否则会获取不到。

把这个方法写在基类

public void getFields() {

        Class<> cls = getClass();

        for (; cls != Objectclass; cls = clsgetSuperclass()) {

            Field[] fs = clsgetDeclaredFields();

            for (Field f : fs) {

                Systemoutprintln(fgetName());

            }

        }

    }

以上就是关于如何获取java泛型的参数类型全部的内容,包括:如何获取java泛型的参数类型、scala中是否有办法从父类中获取当前子类的参数、java中如何获取类的属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存