Java Class.forname,通过运行方法从变量获取结果

Java Class.forname,通过运行方法从变量获取结果,java,android,class,Java,Android,Class,我正在尝试使用Class.forname从android设备获取屏幕大小。 我试图得到的变量是widthPixels和heightPixels,但我得到了错误 预期接收类型为android.util.DisplayMetrics,但得到java.lang.reflect.Field 这是我的密码: public Object field; public String getInstanceValue(String classInstance, String fieldName) {

我正在尝试使用Class.forname从android设备获取屏幕大小。 我试图得到的变量是widthPixels和heightPixels,但我得到了错误

预期接收类型为android.util.DisplayMetrics,但得到java.lang.reflect.Field

这是我的密码:

public Object field;
    public String getInstanceValue(String classInstance, String fieldName) {
        try {
            Class Build1 = Class.forName(classInstance);
            Field strField = Build1.getDeclaredField(fieldName);
            strField.setAccessible(true);
            field = strField.get(strField);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return field.toString();
    }
这是一节课:

package android.util;

public class DisplayMetrics {
    public static final int DENSITY_LOW = 120;
    public static final int DENSITY_MEDIUM = 160;
    public static final int DENSITY_TV = 213;
    public static final int DENSITY_HIGH = 240;
    public static final int DENSITY_XHIGH = 320;
    public static final int DENSITY_400 = 400;
    public static final int DENSITY_XXHIGH = 480;
    public static final int DENSITY_XXXHIGH = 640;
    public static final int DENSITY_DEFAULT = 160;
    public int widthPixels;
    public int heightPixels;
    public float density;
    public int densityDpi;
    public float scaledDensity;
    public float xdpi;
    public float ydpi;

    public DisplayMetrics() {
        throw new RuntimeException("Stub!");
    }

    public void setTo(DisplayMetrics o) {
        throw new RuntimeException("Stub!");
    }

    public void setToDefaults() {
        throw new RuntimeException("Stub!");
    }

    public boolean equals(Object o) {
        throw new RuntimeException("Stub!");
    }

    public boolean equals(DisplayMetrics other) {
        throw new RuntimeException("Stub!");
    }

    public int hashCode() {
        throw new RuntimeException("Stub!");
    }

    public String toString() {
        throw new RuntimeException("Stub!");
    }
}
另外,android.view.Display类还有一个方法getMetrics

public void getMetrics(DisplayMetrics outMetrics) {
        throw new RuntimeException("Stub!");
    }
Plz帮助:)

您应该这样做

Class Build1 = classInstance.getClass();
Field strField = Build1.getDeclaredField(fieldName);
//strField.setAccessible(true); No need as all variables are public
field = strField.get(classInstance); //use classInstance instead of strField
此外,您还必须将方法更改为

public String getInstanceValue(DisplayMetrics  classInstance, String fieldName)

“错误”是java运行时异常还是编译时错误?这无法工作。即使在使用反射时,也需要一个实例而不是一个用于检索实例变量的类。请仔细阅读.true,看起来您需要将classInstance而不是strField传递给get方法。此外,变量名
classInstance
是一个糟糕的选择。这显然是为了识别类而不是实例。我上面的链接有点放错地方了。。。再试一次:1)。2) .对不起,这是错的。尽管名为“classInstance”,但这个字符串变量显然是用来标识类而不是实例。方法
Field.get(Object)
需要为其检索字段的类的实例。不是字符串实例。我在这里看到很多向下投票,请指出why@Seelenvirtuose我还提到了方法签名的更改,显然字符串是不可接受的,但它是所需类的实际实例。@AniketThakur那么您就不能调用
class.forName(classInstance)
。整个问题有点奇怪。而这个答案没有任何好处。我保留我的反对票,因为它仍然是完全错误的!好的,用实例本身获取类
classInstance.getClass()
。更新。