
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中如何获取类的属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)