类型为T的字段

时间:2015-10-08 05:10:26

标签: java reflection

我想从类型为T的对象中获取所有字段及其值。说我有:

something
 <html>
    <head>
       <script type="text/javascript" src="myjavascript.js"></script>
    </head>

    <body>
        <div class="myClass" data-attr="whateverisinthesession"></div>
    </body>
 </html>

然后是Main类,我想要GenericType的字段:

public class Start {

    public void startMethod(){
        Main<GenericType> main = new Main<>();
        main.work(new GenericType());
    }

}

3 个答案:

答案 0 :(得分:0)

首先,您需要获得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

答案 1 :(得分:0)

按照@ 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();
        }
    }
}

虽然在开始时比我简单。谢谢大家。

答案 2 :(得分:0)

如果在类型定义中捕获T,则只能解析class StringMain extends Main<String> {} 。例如:

Type<?> t = TypeResolver.resolveRawArgument(Main.class, StringMain.class);
assert t == String.class

然后您可以使用TypeTools

之类的内容解决问题
java -DR_HOME=<the-location> -jar application.jar

干杯