对于一个类,如何获取其中一个 List<T>成员变量的 T.class

2021-07-01 18:28:24 +08:00
 Tuy

例如:

class A {
	private List<B> list;
    //todo get set
}

我怎么通过 A.class 获得 B.class

2329 次点击
所在节点    Java
12 条回复
running17
2021-07-01 18:37:20 +08:00
Field listField = A.class.getDeclaredField("list");
Type type = listField.getGenericType();
Class detailClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[0];
AoEiuV020
2021-07-01 18:55:32 +08:00
JAVA 就怕泛型,没有泛型的话楼上反射就可以,
泛型涉及类型擦除一般建议单独保存 type,
xuanbg
2021-07-01 20:31:18 +08:00
只要一路泛型到底,就不需要知道具体类型。
Tuy
2021-07-01 21:07:14 +08:00
@running17 谢谢大佬 好用的
Tuy
2021-07-01 21:08:16 +08:00
@AoEiuV020 嗯嗯 还好完全没有泛型 上面的代码可以 hold
Tuy
2021-07-01 21:08:45 +08:00
@xuanbg 做 json 转对象 所有每一个都是具体的 没有泛型 o(╥﹏╥)o
ztcaoll222
2021-07-02 00:12:29 +08:00
@Tuy #6 load json 可以使用 TypeReference
BrokenVns
2021-07-02 00:16:42 +08:00
查你用的 JSON 库的文档,看看有没有提供泛型相关的支持。比如 Gson 会提供 TypeToken 。也可以去参考类似 GSON 等库的实现。
xuanbg
2021-07-02 01:48:17 +08:00
@Tuy JSON 转对象,可以传入 T 的类型啊。
bthulu
2021-07-02 08:35:37 +08:00
改用 c#吧, 真泛型不擦除
siweipancc
2021-07-02 09:17:43 +08:00
你这是要重新实现 jackson?参照一下阿里的运行时 typeReference,直接抄过来也可以
eric96
2021-07-02 11:38:27 +08:00
运行时是找不到的,泛型被擦除了,所以泛型只要保证编译时通过,代码就能跑起来。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/786975

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX