この記事では、クラスの動的ロード、メンバー変数の取得、コンストラクター情報など、Java リフレクション機構に関連する内容を主に紹介します。必要な方は参照してください。
Java プログラムを実行するには、Java 仮想マシンによって Java クラスがロードされる必要があることは誰もが知っています。 Java クラスは、Java 仮想マシンによってロードされないと正常に実行できません。これで、実行するすべてのプログラムは、必要なクラスがコンパイル中にロードされたことを認識します。
Java の リフレクション メカニズム は、コンパイル中にどのクラスがロードされるかを決定せず、プログラムの実行時にのみロード、検出、自己検査を行います。コンパイル時に不明なクラスを使用します。そのような機能が反射です。
リフレクション メカニズムは、実行状態では、どのクラスについても、このクラスのすべてのプロパティとメソッドを知ることができ、どのオブジェクトについても、その動的に取得された情報と動的関数を呼び出すことができます。オブジェクトのメソッドを呼び出す仕組みは、Java 言語のリフレクション メカニズムと呼ばれます。
この記事では、次の側面から リフレクション の知識について説明します:
クラスの使用法 リフレクション コンストラクター リフレクション メンバー変数 リフレクション
1. クラス クラスとは
の世界ではオブジェクト、すべてがオブジェクトです。クラスはオブジェクトであり、クラスは java.lang.Class クラスのインスタンス オブジェクトです。また、クラス class は Java 仮想マシンによってのみ新規作成できます。すべてのクラスは Class クラスのインスタンス オブジェクトです。このインスタンス オブジェクトには 3 つの式があります:
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
Class.forName (クラスの完全名) このメソッドはクラスの型を表すだけでなく、動的にロードされたクラス。コンパイル時にロードされるクラスは静的にロードされ、実行時にロードされるクラスは動的にロードされます。
3. メソッド情報を取得する
基本的なデータ型と void キーワードは、get
ame(); を通じてクラスの名前を取得できます。
Class c1=String.class; Class c2=int.class; Class c3=void.class; System.out.println(c1.getName()); System.out.println(c2.getSimpleName());
クラスのすべてのメソッドを取得して出力します:
public static void printClassInfo(Object object){ Class c=object.getClass(); System.out.println("类的名称:"+c.getName()); /** * 一个成员方法就是一个method对象 * getMethod()所有的 public方法,包括父类继承的 public * getDeclaredMethods()获取该类所有的方法,包括private ,但不包括继承的方法。 */ Method[] methods=c.getMethods();//获取方法 //获取所以的方法,包括private ,c.getDeclaredMethods(); for(int i=0;i<methods.length;i++){ parametertypes="methods[i].getParameterTypes();" pre="" returntype="methods[i].getReturnType();"></methods.length;i++){>
public class ReflectTest { public static void main(String[] args){ String s="ss"; ClassUtil.printClassInfo(s); } }
Run:
类的名称: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); }
走る:
6. メソッドリフレクションの操作
メソッドの取得: メソッドを決定するには、メソッドの名前とメソッドのパラメータを取得する必要があります。
メソッドのリフレクション操作:
java.lang.String([B ,) java.lang.String([B ,int ,int ,) java.lang.String([B ,java.nio.charset.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 ,) …
例:
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()); } }
Run:
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(); } }
この記事ではJavaの基本的な使い方を説明しました。 OK クラスを決定します。実行時に任意のオブジェクトが属するもの、実行時に任意のクラスのメンバー変数とメソッドを決定する、動的プロキシを生成する。
以上がJavaのリフレクション機構に関する注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。