2017-06-06 23 views
2

フィールド値を取得できません。実行しようとしているのは、実行時にオブジェクトを取得することです。私が間違っているところを教えてください。反射を使用してフィールド値を取得する

Test.class

import java.lang.reflect.Field; 

public class Test { 

public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, 
     IllegalArgumentException, IllegalAccessException { 

    final Field field = Class.forName("com.logging.EX").getDeclaredField("value"); 
    field.setAccessible(true); 
    field.get(Class.forName("com.logging.EX")); 
} 

}

EX.class

public class EX { 

private String value; 


public EX(){ 
    value="data"; 
} 
/** 
* @return the value 
*/ 
public String getValue() { 
    return value; 
} 

/** 
* @param value 
*   the value to set 
*/ 
public void setValue(String value) { 
    this.value = value; 
} 

}

+2

'value'はインスタンスフィールドです。 EXのインスタンスはどこですか? – Radiodef

+0

実行時にEXのオブジェクトを取得しようとしています。 – rama

+1

'value'フィールドを取得するには、' value'がインスタンスフィールドなので 'EX'のインスタンスが必要です。現在、あなたのコードはエラーである 'com.logging.EX.class.value'に相当する処理を試みます。 – Radiodef

答えて

2

このような何か...

import java.lang.reflect.Field; 

public class Test { 
    public static void main(String... args) { 
     try { 
      Foobar foobar = new Foobar("Peter"); 
      System.out.println("Name: " + foobar.getName()); 
      Class<?> clazz = Class.forName("com.csa.mdm.Foobar"); 
      System.out.println("Class: " + clazz); 
      Field field = clazz.getDeclaredField("name"); 
      field.setAccessible(true); 
      String value = (String) field.get(foobar); 
      System.out.println("Value: " + value); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class Foobar { 
    private final String name; 

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

    public String getName() { 
     return this.name; 
    } 
} 

または、実行時にオブジェクトのインスタンスを取得するには、クラスのnewInstanceメソッドを使用することができます。ただし、そのインスタンス変数を最初に設定する必要があります。それ以外の場合は、値は設定されません。

など。

Class<?> clazz = Class.forName("com.something.Foobar"); 
Object object = clazz.newInstance(); 

それとも、それはそのコンストラクタ内の2つのパラメータを持ち、文字列例えばint型...

Class<?> clazz = Class.forName("com.something.Foobar"); 
Constructor<?> constructor = clazz.getConstructor(String.class, int.class); 
Object obj = constructor.newInstance("Meaning Of Life", 42); 

それともclazz.getConstructors()

NBを使用して、実行時にそのコンストラクタのためにそれを調べることができますここで作成されたオブジェクトのキャスティングを意図的に省略しました。リフレクションのポイントを打ち負かすことになりました。クラスを既に知っているので、最初のリフレクションの必要性を否定します。場所。

+0

こんにちはMadoDestra、申し訳ありません私は私の質問を更新しました。実行しようとしているのは、実行時にobejctを取得することです。私はオブジェクト名が何であるか分からない。 – rama

+0

インスタンス化できるようにするには、依然としてオブジェクトタイプを知る必要があります。または、あいまいなオブジェクトの場合は、getClass()を呼び出してそのクラスを判別できます。あるいは、instanceofを使用することもできますが、私はこのアプローチを推奨しません。 – ManoDestra

+0

上記で、実行時にオブジェクトのインスタンスを取得する方法について詳しく説明しました。コンストラクタを使用するか、クラスオブジェクト自体でnewInstance()を呼び出しますが、完全修飾パス名を最初に文字列として認識する必要があります。 – ManoDestra

0

あなたは)(field.get上EXのisntanceが必要です。

final Field field = Class.forName("com.logging.EX").getDeclaredField("value"); 
field.setAccessible(true); 
field.get(new EX()); 
0

クラスオブジェクトからインスタンスを作成することができ、これはフィールド取得値で使用できます。

Class modelClass = Class.forName("com.gati.stackoverflow.EX"); 
    final Field field = modelClass.getDeclaredField("value"); 
    field.setAccessible(true); 
    Object modelInstance=modelClass.newInstance(); 
    field.get(modelInstance); 
0

したがって、以下の回答があります。今はうまくいきます。これが最高のものかどうかは分かりません。

あなたのテストクラス:

public class Test { 

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, 
      IllegalArgumentException, IllegalAccessException, InstantiationException { 

     Field[] fields = Class.forName("com.logging.EX").newInstance().getClass().getDeclaredFields(); 
     for (Field field : fields) { 
      field.setAccessible(true); 
      System.out.println(field.getName() + " : " + field.get(Class.forName("com.logging.EX").newInstance())); 
     } 

    } 
} 

は、私がcom.logging.EXのインスタンスを起動することによって、アレイへのすべてのフィールドを抽出し、そのフィールドをすべてのフィールドをループし、名前と値を抽出しています保持する。ここにフィールド名をハードコードしていない。

privateアクセス修飾子で変数にアクセスしましたが、常にリフレクションで存在するため、セキュリティに関する警告はほとんどありません。ただ免責事項!

希望すると便利です。