2017-04-17 5 views
0

variable2の値がnullの場合、Reflection APIを使用してクラスをインスタンス化するとどうなりますか?リフレクションAPIを使用してBeanクラスのゲッターメソッドにアクセスするには?

ここでは、Variable1の値がセットごとに正しく返されます。ここでは、オブジェクトを正常にインスタンス化しました。 ReflectionAPIを使用してvariable2の値を取得するにはどうすればよいですか?

package com.OP.app; 

    public class Bean { 

    private String variable1; 
    private String variable2; 
    public String getVariable1() { 
     return variable1; 
    } 
    public void setVariable1(String variable1) { 
     this.variable1 = variable1; 
    } 
    public String getVariable2() { 
     return variable2; 
    } 
    public void setVariable2(String variable2) { 
     this.variable2 = variable2; 
    } 


} 

package com.OP.app; 

import java.lang.reflect.Method; 

public class ObjectCall { 

    public static void main(String []args){ 
     Bean beanobject = new Bean(); 
     beanobject.setVariable1("Ram"); 
     beanobject.setVariable2("Rakesh"); 
     System.out.println(beanobject.getVariable1()); 
     String path = "com.OP.app.Bean"; 
     Class<?> newClass; 
     try { 
      newClass = Class.forName(path); 
      Object obj = newClass.newInstance(); 
      String getMethod = "getVariable2"; 
      Method getNameMethod = obj.getClass().getMethod(getMethod); 
      String name = (String) getNameMethod.invoke(obj); 
      System.out.println(name); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } // convert string classname to class 
     } 
    } 

出力: ラム ヌル

答えて

0

あなたが例えば、variable1variable2に設定した値を持っていない新しく作成されたオブジェクト(例えばobj)上のメソッドを呼び出しているbeauseつまり:

Object obj = newClass.newInstance(); 

上記のように、Beanの新しいObjectが作成され、null vaは、variable1variable2のためのルーズです。 beanobjectメソッドで設定された値を印刷する場合は、beanobjectでゲッターメソッドを呼び出す必要があります。すなわち、あなたは何の値が設定されていないターゲットクラスの新しいインスタンスを作成します

String name = (String) getNameMethod.invoke(beanobject); 
0

String name = (String) getNameMethod.invoke(obj); 

を変更。

Object obj = newClass.newInstance();   
Method getNameMethod = obj.getClass().getMethod(getMethod); 

変更するには、この行とそれが動作するはずです:

Method getNameMethod = beanobject.getClass().getMethod(getMethod); 

追加: 変数の命名あなたは非常に良いではありません。

public static void main(String[] args) { 
    Bean beanInstance = new Bean(); 
    beanInstance.setVariable1("Ram"); 
    beanInstance.setVariable2("Rakesh"); 

    System.out.println("Value 1 of fresh bean instance: " + beanInstance.getVariable1()); 

    String beanType = Bean.class.getName(); 
    Class<?> beanClazz; 

    try { 
     beanClazz = Class.forName(beanType); 

     String getterMethodName = "getVariable2"; 
     Method getterMethod = beanClazz.getMethod(getterMethodName); 
     Object returnValue = getterMethod.invoke(beanInstance); 

     System.out.println("Value 2 of by reflection loaded bean instance: " + String.valueOf(returnValue)); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } // convert string classname to class 
} 
+0

これは機能しません: 'Class.forName'は、パッケージ名ではなく、修飾されたクラス名を期待しています。しかし、 'Class beanClazz = Bean.class;'はとにかく簡単です。 – CoronA

+0

あなたは正しいです。 Beanクラスは完全なクラス名を必要とします(getName()はこれを行います)。 'Class beanClazz = Bean.class;'より簡単ですが、クラスが実行時にしかわからない場合は、ハードコードされたクラス宣言では何もできません。 –

関連する問題