Java反射メカニズムについて知っておく必要があります

5559 ワード

Javaプログラムを実行できるようにするには、JavaクラスをJava仮想マシンにロードしなければならないことはよく知られています.JavaクラスはJava仮想マシンにロードされなければ正常に動作しません.今私たちが実行しているすべてのプログラムは、コンパイル期間中にあなたが必要とするクラスがロードされていることを知っています.
Javaの反射メカニズムは,コンパイルでどのクラスがロードされたのかを決定するのではなく,プログラムが実行されたときにロード,プローブ,自己審査を行う.コンパイル中に知らないクラスを使用します.このような特徴が反射です.
反射メカニズムは、実行状態において、いずれのクラスに対しても、このクラスのすべての属性と方法を知ることができる.いずれのオブジェクトに対しても、そのメソッドとプロパティを呼び出すことができます.このような動的に取得された情報および動的にオブジェクトを呼び出す方法の機能をjava言語の反射メカニズムと呼ぶ.
この記事では、反射の知識について説明します.
calssの使用方法の反射構造関数の反射メンバー変数の反射
一、classクラスとは
対象に向かう世界では、万物が対象になる.クラスはオブジェクトで、クラスはjavaです.lang.Classクラスのインスタンスオブジェクト.またclassクラスはjava仮想マシンのみnewが出る.いずれのクラスも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();
}

二、classクラスの動的ロード
Class.forName(クラスのフルネーム);この方法はクラスのタイプだけでなく、動的ロードクラスも表します.コンパイル時刻ロードクラスは静的ロード、実行時刻ロードクラスは動的ロードクラスである.
三、取得方法情報
基本的なデータ型、voidキーワードはクラスのインスタンスです.get ame()を使用できます.getSimpleName()はクラスの名前を取得します.

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

public class ReflectTest {
  public static void main(String[] args){
    String s="ss";
    ClassUtil.printClassInfo(s);
  }
}

実行:

    :java.lang.String
booleanequals(java.lang.Object,)
java.lang.StringtoString()
inthashCode()
…

四、メンバー変数の情報を取得する
クラスのメンバー変数情報も取得できます

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

五、構造関数の情報を取得する

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.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());
 }
}

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反射の基本的な使い方を説明し、実行時に任意のオブジェクトが属するクラスを判断することができます.実行時に任意のクラスのオブジェクトを構築します.実行時に任意のクラスが持つメンバー変数と方法を判断する.実行時に任意のオブジェクトを呼び出す方法.動的エージェントを生成します.
以上がJava反射メカニズムに関するすべての内容であり,皆さんの役に立つことを願っています.
詳細については、JavaのRTTIと反射メカニズムコード分析、Java反射メカニズムの理解、Java反射メカニズムの例の詳細を参照してください.