Java Class.forname,通过运行方法从变量获取结果
我正在尝试使用Class.forname从android设备获取屏幕大小。 我试图得到的变量是widthPixels和heightPixels,但我得到了错误 预期接收类型为android.util.DisplayMetrics,但得到java.lang.reflect.Field 这是我的密码: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) {
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()
。更新。