リフレクション メカニズムは、実行状態では、どのクラスについても、このクラスのすべてのプロパティとメソッドを知ることができ、どのオブジェクトについても、その動的に取得された情報と動的関数を呼び出すことができます。オブジェクトのメソッドを呼び出す仕組みは、Java 言語のリフレクション メカニズムと呼ばれます。 [公式ドキュメントより翻訳]
この記事では、次の側面からリフレクションの知識を紹介します:
public class User{ } public class ClassTest{ User u=new User(); //方式1: Class c1=User.class; //方式2: Class c2=u.getClass(); //方式3: Class c3=Class.forName("com.forezp.User"); //可以通过类的类型创建该类的实例对象 User user=(User)c1.newInstance(); }
2. クラス クラスの動的ロード Class.forName (クラスの完全名); このメソッドは、クラスのタイプを表すだけでなく、動的にロードされるクラスも表します。コンパイル時にロードされるクラスは
静的Class c1=String.class; Class c2=int.class; Class c3=void.class; System.out.println(c1.getName()); System.out.println(c2.getSimpleName());
类的名称:java.lang.String booleanequals(java.lang.Object,) java.lang.StringtoString() inthashCode() …
4番目に、メンバー変数情報を取得します
クラスのメンバー変数情報を取得することもできます
public static void printFiledInfo(Object o){ Class c=o.getClass(); /** * getFileds()获取public * getDeclaredFields()获取所有 */ Field[] fileds=c.getDeclaredFields(); for(Field f:fileds){ //获取成员变量的类型 Class filedType=f.getType(); System.out.println(filedType.getName()+" "+f.getName()); } }
public static void main(String[] args){ String s="ss"; //ClassUtil.printClassInfo(s); ClassUtil.printFiledInfo(s); }
[C value int hash long serialVersionUID [Ljava.io.ObjectStreamField; serialPersistentFields java.util.Comparator CASE_INSENSITIVE_ORDER int HASHING_SEED int hash32
5. コンストラクター情報の取得
public static void printConstructInfo(Object o){ Class c=o.getClass(); Constructor[] constructors=c.getDeclaredConstructors(); for (Constructor con:constructors){ System.out.print(con.getName()+”(“); Class[] typeParas=con.getParameterTypes(); for (Class class1:typeParas){ System.out.print(class1.getName()+” ,”); } System.out.println(“)”); } }
public static void main(String[] args){ String s="ss"; //ClassUtil.printClassInfo(s); //ClassUtil.printFiledInfo(s); ClassUtil.printConstructInfo(s); }
実行:
java.lang.String([B ,) java.lang.String([B ,int ,int ,) java.lang.String([B ,java.nio.char set .Charset ,) java.lang.String([B ,java.lang.String ,) java.lang.String([B ,int ,int ,java.nio.charset.Charset ,) java.lang.String(int ,int ,[C ,) java.lang.String([C ,boolean ,) java.lang.String(java.lang.StringBuilder ,) java.lang.String(java.lang.StringBuffer ,)
6. メソッドのリフレクション操作
メソッドの取得: メソッドを決定するには、メソッドの名前とメソッドのパラメータを取得する必要があります。
method.invoke(对象,参数列表);
例:
class A{ public void add(int a,int b){ System.out.print(a+b); } public void toUpper(String a){ System.out.print(a.toUpperCase()); } }
public static void main(String[] args) { A a=new A(); Class c=a.getClass(); try { Method method=c.getMethod("add",new Class[]{int.class,int.class}); //也可以 Method method=c.getMethod("add",int.class,int.class); //方法的反射操作 method.invoke(a,10,10); }catch (Exception e){ e.printStackTrace(); } }
実行:
20
以上がJava リフレクション メカニズムの詳細な概要に関する知識の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。