私はAndroidアプリを開発しています。私は自宅のMacBookと自宅のWindowsコンピュータから離れています。私は両方のマシンで同じJDKバージョン(1.8.0_131)を持っており、ここに示すような正しいJDKパスを設定しています:How to set the JDK in Android Studio。2台のコンピュータでAndroidアプリケーションをテストすると非常に異なる結果が発生する
どちらのマシンでもClass.getDeclaredFields()メソッドを呼び出すと、私は非常に異なる結果になります。私のMacでは、このメソッドは、公共のフィールドだけを見ているようだが、Java-Docのように振る舞う。私のWindowsコンピュータでテストするとき、メソッドはすべてのフィールドを継承したものを返します。これは明示的にJava-Docがメソッドがしないと言っているものです。私はClass.getDeclaredFields()が一貫している必要があります。なぜなら、JSONファイルをGsonでビルドし、プログラムの別の場所にディスクに格納するためです。
さまざまなAndroid Runtimeがあり、プログラムの動作が異なると思われますが、その情報をどこで見つけるか、この問題を修正して展開時に一貫して動作するようにはわかりません。
どちらのマシンでも、Android API 25(Android 7.1.1 Nougat)とビルドツール25.0.2でNexus 5X仮想デバイスを使用しています。
public abstract class Article {
protected Context context;
protected int id;//start at 0 and go up.
private Texture texture;
private Temperature idealTemp;
private Formality formality;
private String name;
private int color; //expressed as hex RGB
private Bitmap image;
JsonObject articleData;
...
@Override
public String toString() {
//TODO: for efficiency, this should be StringBuilder
String temp = "id: " + id + ", texture: " + texture + ", idealTemp: " + idealTemp
+ ", formality: " + formality + ", name: " + name + ", color: #" + color;
Field[] fields = this.getClass().getDeclaredFields();
for (Field f : fields) {
try {
temp = temp.concat(", " + f.getName() + ": " + f.get(this).toString());
} catch (IllegalAccessException e) {
e.printStackTrace();
continue;
}
}
return temp;
}
}//end class
条を継承するクラスがトップで次のようになります:メソッドArticle.toStringを使用しています
public abstract class Top extends Article {
public Top(Context con, Texture tex, Temperature temp, Formality form, String n, int col, Bitmap img) {
super(con, tex, temp, form, n, col, img);
}
}
そして最後に非抽象クラスを
は、ここに私の特定の実装です()はシャツです:
public class Shirt extends Top {
//If this is not public, it is not seen by getDeclaredFields()
//seems to be a bug in the Android Runtime on my Mac?
public boolean longSleeves;
public Shirt(Context con, Texture tex, Temperature temp, Formality form,
String n, int col, Bitmap img, boolean longSleeve) {
super(con, tex, temp, form, n, col, img);
longSleeves = longSleeve;
}
}
更新日:私が最初に投稿したコード代わりに
getDeclaredFields()
の
getFields()
をsedはこれが変更されたと私は、Android Studioのショーで私のデバッガのものを両方表示するには画像が含まれます: マック:
どこでgetDeclaredFields()を呼び出していますか?あなたの質問に正しいコードを含めましたか? – user695022
getDeclaredFields()を使用するようにコードを更新しましたが、同様の問題があります。上記の質問の更新を参照してください。 –