来自类型 T 的字段
Fields from type T
我想从 T 类型的对象中获取所有字段及其值。假设我有:
public class Start {
public void startMethod(){
Main<GenericType> main = new Main<>();
main.work(new GenericType());
}
}
然后是 class Main,我想要 GenericType 的字段:
public class Main<T> {
public void work(T t){
// Is there a way to get t's fields and values?
}
}
首先需要获取Class
个T
,然后通过反射获取所有字段
abstract class A<T> {
Class<T> clazz;
void doGetClass() {
Type genType = this.getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
this.clazz = (Class<T>) params[0];
}
}
但是你必须实例化泛型类型,像这样,实例化 T
到 String
:
class B extends A<String>{
}
然后
B b = new B();
b.doGetClass();// b.clazz is String.class
根据@BalwinderSingh 的回答,我得出了这个结论:
public void work(T t){
for(Field f : t.getClass().getDeclaredFields()){
try {
f.setAccessible(true);
String name = f.getName();
Object value = f.get(object);
}catch(Exception e){
e.printStackTrace();
}
}
}
比我一开始想的要简单。谢谢大家
如果 T
在类型定义中被捕获,您只能解析它。例如:
class StringMain extends Main<String> {}
然后你可以用TypeTools:
之类的东西来解决
Type<?> t = TypeResolver.resolveRawArgument(Main.class, StringMain.class);
assert t == String.class
干杯
我想从 T 类型的对象中获取所有字段及其值。假设我有:
public class Start {
public void startMethod(){
Main<GenericType> main = new Main<>();
main.work(new GenericType());
}
}
然后是 class Main,我想要 GenericType 的字段:
public class Main<T> {
public void work(T t){
// Is there a way to get t's fields and values?
}
}
首先需要获取Class
个T
,然后通过反射获取所有字段
abstract class A<T> {
Class<T> clazz;
void doGetClass() {
Type genType = this.getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
this.clazz = (Class<T>) params[0];
}
}
但是你必须实例化泛型类型,像这样,实例化 T
到 String
:
class B extends A<String>{
}
然后
B b = new B();
b.doGetClass();// b.clazz is String.class
根据@BalwinderSingh 的回答,我得出了这个结论:
public void work(T t){
for(Field f : t.getClass().getDeclaredFields()){
try {
f.setAccessible(true);
String name = f.getName();
Object value = f.get(object);
}catch(Exception e){
e.printStackTrace();
}
}
}
比我一开始想的要简单。谢谢大家
如果 T
在类型定义中被捕获,您只能解析它。例如:
class StringMain extends Main<String> {}
然后你可以用TypeTools:
之类的东西来解决Type<?> t = TypeResolver.resolveRawArgument(Main.class, StringMain.class);
assert t == String.class
干杯