如何在使用反射时访问实例?

时间:2017-09-19 10:07:00

标签: java

我有一个在运行时遍历实例的成员的类。

下面是一个包含不同类型字段的类。 AssetTexture是我想要循环的类型之一。

public class A {

    public static AssetTexture T_BG          = new AssetTexture("bg.png");
    public static AssetTexture T_REELS       = new AssetTexture("reels.png");
    public static AssetTexture T_LOGO        = new AssetTexture("logo.png");

    public static String things_that_should_not_inside_the_loop;

}

以下是AssetTexture类的示例代码。它只包含一个名称。

class AssetTexture {

    private String name;

    public AssetTexture(String name){
        this.name=name;
    }

}

下面是我在运行时循环遍历所有字段的方法。它很成功。但我已经尝试了所有可用的方法。它没有获得会员的方法。

public class Manager {

    public Manager(){

        A a=new A();//init A

        //loop through all field of instance a
        Field[] fields=this.a.getClass().getDeclaredFields();
        for(Field field:fields){
        if(field.getType().equals(AssetTexture.class)){
            Gdx.app.debug("Debug", field.getName());
        }
    }

}

当前输出:

T_BG
T_LOGO
T_REELS

预期结果:

bg.png
reels.png
logo.png

我试图在AssetTexture中使用toString方法并覆盖toString。像下面的代码一样

field.getName() ---> field.toString()

覆盖了AssetTexture中的toString

class AssetTexture {

    @Override
    public String toString() {return name;}

}

但它没有运行覆盖方法。

1 个答案:

答案 0 :(得分:2)

请致电field.getName(),而不是致电field.get(null).toString()Field.get返回特定实例的字段值,对于静态字段,实例不是必需的,因此您可以传递null。