public class hiField extends Object
1フィールドの型構造を保持します。
java.lang.refrection.Fieldでは消えてしまう配列内ジェネリックの引数型なども保持します。
フィールド
ArrayList<HashMap<String,Integer>>[][]
に対して次の構造が作られます
{
   description=java.util.ArrayList<java.util.HashMap<java.lang.String,java.lang.Integer>>[][]
  ,clazzForName=[[Ljava.util.ArrayList;
  ,clazz=class [[Ljava.util.ArrayList;
  ,arrayComponent={
      clazzForName=[Ljava.util.ArrayList;
     ,clazz=class [Ljava.util.ArrayList;
     ,arrayComponent={
         clazzName=java.util.ArrayList
        ,clazzForName=Ljava.util.ArrayList;
        ,clazz=class java.util.ArrayList
        ,typeParameters=[
            {
               description=java.util.HashMap<java.lang.String,java.lang.Integer>
              ,clazzName=java.util.HashMap
              ,clazzForName=Ljava.util.HashMap;
              ,clazz=class java.util.HashMap
              ,typeParameters=[
                  {
                     description=java.lang.String
                    ,clazzName=java.lang.String
                    ,clazzForName=Ljava.lang.String;
                    ,clazz=class java.lang.String}
                 ,{
                     description=java.lang.Integer
                    ,clazzName=java.lang.Integer
                    ,clazzForName=Ljava.lang.Integer;
                    ,clazz=class java.lang.Integer}]}]}}}
primitiveやprimitiveの配列では次の様になります。
{
   description=int
  ,clazzName=int
  ,clazzForName=I
  ,clazz=int}
{
   description=int[]
  ,clazzForName=[I
  ,clazz=class [I
  ,arrayComponent={
      clazzName=int
     ,clazzForName=I
     ,clazz=int}}
{
   description=int[][]
  ,clazzForName=[[I
  ,clazz=class [[I
  ,arrayComponent={
      clazzForName=[I
     ,clazz=class [I
     ,arrayComponent={
         clazzName=int
        ,clazzForName=I
        ,clazz=int}}}
本クラスには複数のstaticメソッドが用意されていますが、整理されているとは言いがたいもので、削除・変更の可能性が高いことに留意してください。
| 修飾子とタイプ | クラスと説明 | 
|---|---|
| static interface  | hiField.HasValueクラスがvalueという名のフィールドがあることをしめす | 
| 修飾子とタイプ | フィールドと説明 | 
|---|---|
| hiField | arrayComponent配列の内容 | 
| Class<?> | clazzクラス 配列などもクラス化されている | 
| String | clazzForNameClass.forName()で使うクラス名 配列やprimitiveも | 
| String | clazzNameクラス名 | 
| String | description | 
| Method | methodadd/putメソッド | 
| HashMap<String,Integer> | paramPosパラメタ名の位置 | 
| ArrayList<hiField> | typeParametersパラメタ型のパラメタ並び | 
| Object | user_info | 
| コンストラクタと説明 | 
|---|
| hiField(Field field_)Field情報から作成する. | 
| hiField(String typeDescription_)typeを表す文字列からから作成する. | 
| hiField(Type t_)Type情報から作成する. | 
| 修飾子とタイプ | メソッドと説明 | 
|---|---|
| static hiField | get(Class<?> class_) | 
| hiField | get(Field field_) | 
| hiField | getComponent()この配列要素を得る. | 
| Field | getField()Fieldで構築された場合のFieldを得る. | 
| static <T> T | getField(Class<?> src_class_,
        Class<T> class_,
        String name_)指定名のstatic要素オブジェクトを取得する
構造体のstatic要素を型と名前指定で取得します。 | 
| static <T> T | getField(Class<?> src_class_,
        Class<T> class_,
        String name_,
        long option_)指定名のstatic要素オブジェクトを取得する
構造体のstatic要素を型と名前指定で取得します。 | 
| static <T> T | getField(Class<?> src_class_,
        Object src_obj_,
        Class<T> class_,
        String name_)指定名の要素オブジェクトを取得する
 getField(Class,Object,Class,String)からオプション指定を取り外したものです。 | 
| static <T> T | getField(Class<?> src_class_,
        Object src_obj_,
        Class<T> class_,
        String name_,
        long option_) | 
| static <T> T | getField(Object src_obj_,
        Class<T> class_,
        String name_)指定名の要素オブジェクトを取得する
構造体の要素を型と名前指定で取得します。 | 
| static <T> T | getField(Object src_obj_,
        Class<T> class_,
        String name_,
        long option_)指定名の要素オブジェクトを取得する
 getField(Object,Class,String)にオプションを追加したものです。 | 
| Class<?> | getFieldClass()Class<? | 
| static <T> HashMap<String,T> | getFields(Class<?> src_class_,
         Class<T> class_)指定型のstatic要素オブジェクト(複数)を取得する. | 
| static <T> HashMap<String,T> | getFields(Class<?> src_class_,
         Class<T> class_,
         long option_)指定型のstatic要素オブジェクト(複数)を取得する. | 
| static <T> HashMap<String,T> | getFields(Class<?> src_class_,
         Object src_obj_,
         Class<T> class_,
         long option_)指定型の要素オブジェクト(複数)を取得する. | 
| static <T> HashMap<String,T> | getFields(Object src_obj_,
         Class<T> class_)指定型の要素オブジェクト(複数)を取得する. | 
| static <T> HashMap<String,T> | getFields(Object src_obj_,
         Class<T> class_,
         long option_)指定型の要素オブジェクト(複数)を取得する. | 
| static Method | getMethod(Object obj_,
         String method_,
         Object... args_)指定名のメソッドを得る. | 
| ArrayList<hiField> | getParameterizedTypes()この階層のパラメタ並びを得る. | 
| void | hiFieldReurcive(Type t_) | 
| static void | init_infos() | 
| static Object | invokeMethod(Object obj_,
            String method_,
            Object... args_)指定名のメソッドを実行する(試験中). | 
| boolean | isArray()この階層が配列か. | 
| boolean | isParameterized()この階層がジェネリック(Parameterized)か. | 
| boolean | isPrimitive()この階層がprimitiveか | 
| boolean | isSimpleClass()この階層が単純型か | 
| static void | setField(Class<?> dst_class_,
        Object dst_obj_,
        String name_,
        Object value_)指定名の要素オブジェクトを設定する
 setField(Class,Object,String,Object,long)からオプションを省略したメソッドです | 
| static void | setField(Class<?> dst_class_,
        Object dst_obj_,
        String name_,
        Object value_,
        long option_)指定名の要素オブジェクトを設定する
通常は  setField(Class,String,Object),setField(Class,String,Object,long),#setField(Object,String,Object)},setField(Object,String,Object,long)を使います。 | 
| static void | setField(Class<?> dst_class_,
        String name_,
        Object value_)指定名のstatic要素オブジェクトを設定する. | 
| static void | setField(Class<?> dst_class_,
        String name_,
        Object value_,
        long option_)指定名のstatic要素オブジェクトを設定する
構造体の指定名の要素に値を設定します。 | 
| static void | setField(Object dst_obj_,
        String name_,
        Object value_)指定要素に値を設定する. | 
| static void | setField(Object dst_obj_,
        String name_,
        Object value_,
        long option_)指定要素に値を設定する. | 
| static Object | val(Object obj_)valueフィールドを取得. | 
| static <T> T | val(Object obj_,
   Class<T> class_)valueフィールドを取得
"value"という名の指定型のフィールドの値を得ます。 | 
public String description
public String clazzName
public String clazzForName
public Class<?> clazz
public Method method
public hiField arrayComponent
public Object user_info
public hiField(Field field_)
field_ - フィールドpublic hiField(Type t_)
t_ - Typepublic hiField(String typeDescription_)
typeDescription_ - タイプを表す文字列public static void init_infos()
public final Field getField()
public final boolean isArray()
public final hiField getComponent()
public final boolean isParameterized()
public final ArrayList<hiField> getParameterizedTypes()
public final boolean isPrimitive()
public final boolean isSimpleClass()
public final Class<?> getFieldClass()
public void hiFieldReurcive(Type t_)
public static <T> HashMap<String,T> getFields(Class<?> src_class_, Object src_obj_, Class<T> class_, long option_)
通常はgetFields(Object,Class),getFields(Object,Class,long),getFields(Class,Class),getFields(Class,Class,long)を使います。
このメソッドはベースクラスを指定して探索したい場合などに使用します。
取得する要素に関してもオプションで派生関係の取り扱いを指定できます。
   class A {
      int    i_0=0;
      int    i_1=1;
      String name="A";
      }
   class B extends A {
      int    i_1=11;
      int    i_2=12;
      }
   class C extends B {
      int    i_1=101;
      int    i_2=102;
      String name="C";
      }
   class D {
      int d_i=0;
      A a=new A();
      B b=new B();
      C c=new C();
      }
   //
   void foo(C c_)throws Exception{
      HashMap<String,Object> _fieldC = hiField.getFields(C.class,c_,Object.class,hiU.NO_OPTION);
      // _filedC  = {name=C, i_1=101, i_0=0, i_2=102}
      HashMap<String,Object> _fieldB = hiField.getFields(B.class,c_,Object.class,hiU.NO_OPTION);
      // _filedB  = {name=A, i_1=11, i_0=0, i_2=12}
      HashMap<String,Object> _fieldA = hiField.getFields(A.class,c_,Object.class,hiU.NO_OPTION);
      // _fieldA  = {name=A, i_1=1, i_0=0}
      HashMap<String,Object> _fieldCC= hiField.getFields(C.class,c_,Object.class,hiU.SHALLOW);
      // _filedCC = {name=C, i_1=101, i_2=102}
      HashMap<String,Object> _fieldBB= hiField.getFields(B.class,c_,Object.class,hiU.SHALLOW);
      // _filedBB = {i_1=11, i_2=12}
      //---  要素の派生型に関する指定
      HashMap<String,Object> _fieldD= hiField.getFields(D.class,d_,Object.class,hiU.NO_OPTION);
      // _fieldD  = {a={...}, b={...}, c={...}, d_i=0} 全て取得
      HashMap<String,Object> _fieldDA= hiField.getFields(D.class,d_,A.class,hiU.NO_OPTION);
      // _fieldDA = {a={...}, b={...}, c={...}}        Aの派生取得
      HashMap<String,Object> _fieldDB= hiField.getFields(D.class,d_,B.class,hiU.NO_OPTION);
      // _fieldDB = {b={...}, c={...}}                 Bの派生取得
      HashMap<String,Object> _fieldDC= hiField.getFields(D.class,d_,C.class,hiU.NO_OPTION);
      // _fieldDC = {c={...}}                          Cの派生取得
      HashMap<String,Object> _fieldDBo= hiField.getFields(D.class,d_,B.class,hiU.ONLY_TARGET_CLASS);
      // _fieldDBo= {b={...}}                          Bのみ
      }
    // hiU.NO_OPTIONは省略できます。対象とする構造体オブジェクトとクラスが一致する場合クラス指定を省略できます。
    // 例えば
    //   hiField.getFields(C.class,c_,Object.class,hiU.NO_OPTION)
    // は
    //   hiField.getFields(c_,Object.class)
    // と記述できます。
T - 要素の型src_class_ - 調べる構造体の型src_obj_ - 調べる構造体の実体class_ - 取得する要素の型option_ - hiU.PUBLIC_ONLY,hiU.FORCE,hiU.SHALLOW,hiU.EVEN_FINAL_STATICpublic static <T> HashMap<String,T> getFields(Class<?> src_class_, Class<T> class_)
構造体の要素の内、classのオブジェクトを、型指定で取得します。
intやbooleanなどのプリミティブ型はそれぞれのラッパーIntegerやBooleanで指定します。
T - 要素の型src_class_ - 調べる構造体の型class_ - 取得する要素の型public static <T> HashMap<String,T> getFields(Class<?> src_class_, Class<T> class_, long option_)
構造体の要素の内、classのオブジェクトを、型指定で取得します。
intやbooleanなどのプリミティブ型はそれぞれのラッパーIntegerやBooleanで指定します。
T - 要素の型src_class_ - 調べる構造体の型class_ - 取得する要素の型option_ - hiU.PUBLIC_ONLY,hiU.FORCE,hiU.SHALLOW,hiU.EVEN_FINAL_STATICpublic static <T> HashMap<String,T> getFields(Object src_obj_, Class<T> class_)
static要素も取得します。
構造体の要素(複数)を型指定で取得します。
intやbooleanなどのプリミティブ型はそれぞれのラッパーIntegerやBooleanで指定します。
T - 要素の型src_obj_ - 調べる構造体の実体class_ - 取得する要素の型public static <T> HashMap<String,T> getFields(Object src_obj_, Class<T> class_, long option_)
getFields(Object,Class)にオプションを付加したメソッドです
T - 要素の型src_obj_ - 調べる構造体の実体class_ - 取得する要素の型option_ - hiU.PUBLIC_ONLY,hiU.FORCE,hiU.SHALLOW,hiU.EVEN_FINAL_STATICpublic static <T> T getField(Class<?> src_class_, Object src_obj_, Class<T> class_, String name_, long option_)
通常はgetField(Object,Class,String),getField(Object,Class,String,long),getField(Class,Class,String),getField(Class,Class,String,long)を使います。
このメソッドはベースクラスを指定して探索したい場合などに使用します。
型指定と派生の関連に関してはgetFields(Class,Object,Class,long)を参照してください。
T - 要素の型src_class_ - 調べる構造体の型src_obj_ - 調べる構造体の実体class_ - 取得する要素の型name_ - 取得したい要素の名前option_ - hiU.PUBLIC_ONLY,hiU.FORCE,hiU.SHALLOW,hiU.EVEN_FINAL_STATIChiException - NoSuchFieldExceptionをcauseとして持つpublic static <T> T getField(Class<?> src_class_, Object src_obj_, Class<T> class_, String name_)
getField(Class,Object,Class,String)からオプション指定を取り外したものです。
T - 要素の型src_class_ - 調べる構造体の型src_obj_ - 調べる構造体の実体class_ - 取得する要素の型name_ - 取得したい要素の名前hiException - NoSuchFieldExceptionをcauseとして持つpublic static <T> T getField(Class<?> src_class_, Class<T> class_, String name_)
構造体のstatic要素を型と名前指定で取得します。
intやbooleanなどのプリミティブ型はそれぞれのラッパーIntegerやBooleanで指定します。
T - 要素の型src_class_ - 調べる構造体の型class_ - 取得する要素の型name_ - 取得したい要素の名前hiException - NoSuchFieldExceptionをcauseとして持つpublic static <T> T getField(Class<?> src_class_, Class<T> class_, String name_, long option_)
構造体のstatic要素を型と名前指定で取得します。
intやbooleanなどのプリミティブ型はそれぞれのラッパーIntegerやBooleanで指定します。
T - 要素の型src_class_ - 調べる構造体の型class_ - 取得する要素の型name_ - 取得したい要素の名前option_ - hiU.PUBLIC_ONLY,hiU.FORCE,hiU.SHALLOW,hiU.EVEN_FINAL_STATIChiException - NoSuchFieldExceptionをcauseとして持つpublic static <T> T getField(Object src_obj_, Class<T> class_, String name_)
構造体の要素を型と名前指定で取得します。
intやbooleanなどのプリミティブ型はそれぞれのラッパーIntegerやBooleanで指定します。
      try{
         WinElms _winElms= ..;// WinElmsに複数の画面要素があるとして
         String  _name   = ..;// この名前のJTextField要素を取得するとして
         Object  _obj = hiField.getField(_winElms,JTextField.class,_name);
         ((JTextField)_obj).setBackground(Color.RED);
         }
      catch(Exception _ex){ hiU.err.println(_ex); } // 見つからない
T - 要素の型src_obj_ - 調べる構造体の実体class_ - 取得する要素の型name_ - 取得する要素の名前hiException - NoSuchFieldExceptionをcauseとして持つpublic static <T> T getField(Object src_obj_, Class<T> class_, String name_, long option_)
getField(Object,Class,String)にオプションを追加したものです。
次のオプションが有効です。
T - 要素の型src_obj_ - 調べる構造体の実体class_ - 取得する要素の型name_ - 取得する要素の名前option_ - hiU.PUBLIC_ONLY,hiU.FORCE,hiU.SHALLOW,hiU.EVEN_FINAL_STATIChiException - NoSuchFieldExceptionをcauseとして持つpublic static Object val(Object obj_)
"value"という名のフィールドの値を得ます。
例えば
 ・hiRef.V1
 ・Optional
などがこのフィールドを持ちます。
利用者が作成したクラスでも"value"を持つ場合取得できます。
次の操作と同等です。
     getField(obj_.getClass(),obj_,Object.class,"value",hiU.FORCE);
obj_ - 調べる構造体の実体hiException - NoSuchFieldExceptionをcauseとして持つpublic static <T> T val(Object obj_, Class<T> class_)
"value"という名の指定型のフィールドの値を得ます。
T - フィールドの型obj_ - 調べる構造体の実体class_ - クラスhiException - NoSuchFieldExceptionをcauseとして持つpublic static void setField(Class<?> dst_class_, Object dst_obj_, String name_, Object value_, long option_)
通常は setField(Class,String,Object),setField(Class,String,Object,long),#setField(Object,String,Object)},setField(Object,String,Object,long)を使います。
このメソッドはベースクラスを指定して探索したい場合などに使用します。
型指定と派生の関連に関してはgetFields(Class,Object,Class,long)を参照してください。
dst_class_ - 対象となる構造体のclassdst_obj_ - 対象となる構造体の実体name_ - 設定する要素の名前value_ - 設定する値option_ - hiU.PUBLIC_ONLY,hiU.FORCE,hiU.SHALLOWhiException - NoSuchFieldExceptionをcauseとして持つpublic static void setField(Class<?> dst_class_, Object dst_obj_, String name_, Object value_)
setField(Class,Object,String,Object,long)からオプションを省略したメソッドです
dst_class_ - 対象となる構造体のclassdst_obj_ - 対象となる構造体の実体name_ - 設定する要素の名前value_ - 設定する値hiException - NoSuchFieldExceptionをcauseとして持つpublic static void setField(Class<?> dst_class_, String name_, Object value_)
構造体の指定名のstatic要素に値を設定します。
intやbooleanなどのプリミティブ型はそれぞれのラッパーIntegerやBooleanで指定します。
dst_class_ - 対象となる構造体のclassname_ - 設定する要素の名前value_ - 設定する値hiException - NoSuchFieldExceptionをcauseとして持つpublic static void setField(Class<?> dst_class_, String name_, Object value_, long option_)
構造体の指定名の要素に値を設定します。
intやbooleanなどのプリミティブ型はそれぞれのラッパーIntegerやBooleanで指定します。
dst_class_ - 対象となる構造体のclassname_ - 設定する要素の名前value_ - 設定する値option_ - hiU.PUBLIC_ONLY,hiU.FORCE,hiU.SHALLOWhiException - NoSuchFieldExceptionをcauseとして持つpublic static void setField(Object dst_obj_, String name_, Object value_)
構造体の指定名の要素に値を設定します。
dst_obj_ - 設定対象name_ - 要素名value_ - 値hiException - NoSuchFieldExceptionをcauseとして持つpublic static void setField(Object dst_obj_, String name_, Object value_, long option_)
構造体の指定名の要素に値を設定します。
dst_obj_ - 設定対象name_ - 要素名value_ - 値option_ - hiU.PUBLIC_ONLY,hiU.FORCE,hiU.SHALLOWhiException - NoSuchFieldExceptionをcauseとして持つpublic static Object invokeMethod(Object obj_, String method_, Object... args_)
指定名のメソッドを実行します。
検出できるメソッドには次の制限があります。
import otsu.hiNote.hiU;
public class XX{
   public void foo(Object x){// xにdoSomething()があれば実行
      String    s1= "13";
      String    s2= "abc";
      try{
         hiU.invokeMethod(x,"doSomething",s1,s2);
         }
      catch(Exeption ex){
         hiU.err.println("foo: "+ex);
         }
      }
   }
obj_ - オブジェクトmethod_ - メソッド名args_ - 引数RuntimeException - 呼び出し失敗hiU.getMethod()public static Method getMethod(Object obj_, String method_, Object... args_)
指定名のメソッドを得ます。
検出できるメソッドには次の制限があります。
import otsu.hiNote.hiU;
import java.lang.reflect.*;
class XX{
   void foo(Object x){// xにdoSomething()があれば実行
      String    s1= "13";
      String    s2= "abc";
      Method    m= hiU.getMethod(x,"doSomething",s1,s2);
      if( m!= null ) m.invoke(x,i,s);// メソッド実行
      }
   }
obj_ - オブジェクトmethod_ - メソッド名args_ - 引数hiU.invokeMethod()