常習的にJava反射メカニズムについて話しています。


反射メカニズムは何ですか?
反射はJava言語の特性であり、実行時に自己検査を行い、内部のメンバーを操作するプログラムです。例えば、Javaのクラスが彼のメンバー変数と方法をすべて取得し、表示することができます。これは特定できますが、他のCやC++言語にはあまり存在しません。一般的な例としては、JavaBeanにおいて、いくつかのコンポーネントは一つのコンストラクタを介して動作することができる。このコンストラクタは、動的にロードされたときに得られたjavaのクラスの属性を反射するものです。
主なクラス
クラスの例は、実行中のJavaアプリケーションのクラスとインターフェースを表します。Classには共通の構造方法がありません。クラスのオブジェクトは、クラスをロードする際にJava仮想マシンと、クラスキャリアの中のdefineClassを呼び出す方法で自動的に構成されます。
Costructorはクラスの単一構造方法に関する情報とそのアクセス権限を提供します。
Methodは、クラスまたはインターフェース上の別の方法(および方法にどうやってアクセスするか)に関する情報を提供する。反映される方法は、抽象的な方法を含む、クラスの方法または例示的な方法でありうる。
Fieldは主にクラスのメンバー変数へのアクセスと使用を提供します。
クラス
クラスクラスも一般型を使っています。つまりクラスです。
よく使う方法
get Controuctor(Class[]params)は、共通の構造方法を取得し、パラメータの個数と種類を限定して、異なる公共構造方法を得ることができる。
Costructor[]get Controuctors()すべての公共に戻る構造方法
get DecleadControuctor(Class[]params)は、すべての指定された構造方法を取得しますが、プライベートな構造方法を取得する場合は、setAccess ibleを使用してアクセス権限を設定してtrueにしないと構造ができないので、異常が発生します。
Costructtor[]get DecleadControuctors()はすべての構造方法を返してpublicとprvateを含んで、protectedは修飾します。
T newInstanceはデフォルトの構造方法を呼び出します。name()が実装されているObjectオブジェクトは、汎型を使うとTタイプに戻り、逆にObjectは強制変換が必要で、このオブジェクトを使ってメンバー関数とメンバー変数を呼び出すことができます。
Class forName(String class_)name)はクラスの対象に戻ります。各ペアに一つの方象法があります。クラスの対象に戻ります。
Package Package()は、このような場所のパケット名(package demo)を返します。もちろん、Package.get Name()を使用して、パケットの名前(demo)を取得することもできます。例えば、construtor.getPackage().get Name()。
int getModifiers()は、クラスの修繕子の整数タイプ(修繕子のタイプはpublic prvate protected)を返します。整数を得るには、ModifierのtoString(int num)を使ってpublic、prvate、protectedのタイプがあります。
*Method get Method(String name、Class<?>parameterTypesは、指定されたパラメータの方法Methodオブジェクトを返します。ここでは、単に戻る時に共通する方法です。例えば、Method method=class 1.get Method(「display」、new Class[]{int.class}ここのdisplayは、メソッド名です。パラメータタイプはintです。
Method[]getMethods()は、すべての共通の方法を取得して、行列(Method)を返します。
Method get DecleadMethod(String name,Class<?>parameterTypesは指定されたパラメータをすべて返す方法です。パラメータはnull(パラメータなし)です。
Method[]get DecleadMethods()すべての方法を取得します。
Field get Field(String name)名前を指定するパブリックメンバー変数(public)
Field[]getFields()は、すべての共通メンバー変数を取得します。
Field getDecleadField(String name)は、すべての指定された名前のメンバー変数(public、protected、prvate)を取得し、同様にプライベートメンバ変数を呼び出す際には、先にアクセス権限を設定してください。field.setAccess ible(true)
Field[]get DecleadFields()は、すべてのメンバー変数(public、protected、prvate)を取得します。
get Superclass()は、このクラスが表すエンティティ(クラス、インターフェース、基本タイプ、またはvoid)を示す超クラスのクラスクラスクラスを返します。
URL getResource(String name)は、指定された名前のリソース(画像、ファイル)を検索します。このリソースは指定されたクラスと同じパッケージにある必要があります。そうでないとnullに戻ります。例えば、Testクラスのairplane.png画像を検索します。Test.gets Resource(「airplone.png」)は絶対パスです。
クラスのオブジェクトを取得し、実行します。
Class.forNameを使っています。その中でclassNameはカバンの名前が含まれています。下のdemoはカバンの名前です。Testはクラスの名前です。これは一番よく使われている方法です。JDBCを学んだことがありますが、ローディング駆動を知っている時に使うクラス・forNameです。

 /*
   *      forName(String className),  className         ,   demo      ,Test     
   */
  Class cls=Class.forName("demo.Test");
  Test test=(Test)cls.newInstance();  //                   
クラス名を使う

  Class cls=Test.class;
使用対象.get Class()

  Test test=new Test();
  Class cls=test.getClass(); 
コンストラクタ
主にクラスの構造方法を操作するために使われていますが、これも汎型を使っていることが分かります。上のクラスと同じです。ここで汎型を使っていないと、元々T型に戻したのは全部Objectに戻ります。
よく使う方法
T newInstance(Object parms)はパラメータを持つ構造方法でオブジェクトを実例化し、汎型を使用するとTタイプに戻ります。逆にObjectタイプに戻り、強制的に変換する必要があります。
getName()は構造方法の名称を文字列で返し、具体的な経路はパケット名(demo.Test)を含む。
int get Modifiers()とクラスの方法は同じです。
Method
主にクラスの中の方法の操作を提供します。
よく使う方法
Object invoke(Object obj,object args)は、得られたMethodオブジェクト呼び出し方法を使用して、Objectはクラスの既に構築されたオブジェクトです。静的方法であれば直接nullを書きます。静的方法の呼び出しは対象を必要としないので、戻り値はObjectタイプです。戻り値を受ければ、強制的に対応するタイプに変換する必要があります。argsは、複数のパラメータがあります。配列new Object[]{22、‘chenjiabing’}は、後にカンマで追加または直接作成できます。例えば:method.invoke(test,22,chenjiabing)method.invoke(test,new Object){22,chenjiabing}は、呼び出しられたpriveタイプの方法であれば、先にアクセスする必要があります。
String get Name()はこの方法の名前を返します。
Modifier getModifiers()は、この方法の修飾子の種類表示の整数を返します。Modifier.toString()を使って文字列形式に変換できます。
Class get ReturnType()はこの方法の戻りのタイプを返します。
String toString()は、この方法で表される文字列の形を返します。
Field
クラスのメンバー変数の操作を主に提供します。
一般的な方法
Stering getName()は変数名を返します。
Object get(Object Obj)は、この変数の指定されたオブジェクトの値を返します。オブジェクトを作成する際には、個々の変数の値が異なるため、オブジェクトobjを使用する必要があります。Objectタイプは、入力されたオブジェクトを表しますので、強制的に変換する必要があります。
void set(Object obj,Object value)は、Objectオブジェクト上の変数の値をvalueと変更します。
Modifier get Modifiers()は整数を返して修飾の種類を表します。
String getType()変数の種類を取得する(int,String,double float...)
Modifier
Modifier類はstatic方法と定数を提供し、クラスとメンバーに対して修饰符にアクセスして復号する。修飾子セットは整数として表され、異なるビット位置(bit position)で異なる修飾子を表します。
よく使う方法
static String toString(int mode)は、修繕子を表す整数形式を文字列形式の修整子に変換します。例えば、1をpublicに変換します。
static isInterface(int mode)整数パラメータがinterface修飾子を含む場合、trueに戻ります。そうでなければfalseに戻ります。
Sttic isStatic(int mode)
static isPrivate(int mode)
static isPublic(int mode)
static isAbstract(int mode)
実例

Modifier.toString(Test.class.getModifiers())  //  Test     
使用
上のマットがあれば、上のこれらの種類を使って操作できます。操作を行う前に、まずTestを定義して、demoのカバンの下に置いてください。内容は以下の通りです。

package demo;

import java.util.jar.Attributes.Name;

import javax.print.attribute.standard.MediaSize.NA;

public class Test {
 public String name;
 private int age;

 public Test() {
  this.name = "   ";
  this.age = 23;
 }

 public Test(String name, int age) {
  this.name = name;
  this.age = age;
 }

 public void display() {
  System.out.println("name=" + this.name + "----age=" + this.age);
 }

 public void set(String name, int age) {
  this.name = name;
  this.age = age;
 }

 private int getAge() {
  return this.age;
 }

}
オブジェクトを具体化
Classを使ってデフォルトの構造newInstance()

Class class1=Class.forName("demo.Test"); //    Class

Test test=(Test)class1.newInstance(); //         (public Test())     ,        ,      

test.display();  //  display  
Classの中のget Controuctorを使って対象を構造して、注意しなければならないのはprvateタイプの構造方法を使う時必ず先に訪問権限を設定してtrue-construct.set Access ibleです;

 /*
   *  public Test(String name,int age)  Constructor     
   * 1.Constructor constructor=class1.getConstructor(new Class[]{String.class,int.class});
   * 2.Constructor constructor=class1.getConstructor(String.class,int.class);          ,            
   * 
   * 
   * 
   * 
   *  newInstance()         
   * 1.Test test=(Test)constructor.newInstance(new Object[]{"chenjiabing",22});
   * 2.Test test=(Test)constructor.newInstance("chenjiabing",22);         ,            
   *
   */
  
  
  
  
  /*
   *   public Test(String name,int age)
   *  Class.getConstructor()           ,          ,      ,      getDeclaredConstructor(Class<?>... parameterTypes)
   *  Test test=(Test)constructor.newInstance("   ",22);
   * 
   * 
   *   public Test() 
   *  Constructor constructor=class1.getConstructor(null);
   *  Test test=(Test)constructor.newInstance(null);
   * 
   * 
   *   private Test(int age)
   *  Constructor constructor=class1.getDeclaredConstructor(new Class[]{int.class});
    constructor.setAccessible(true); //  private           ,           true
    Test test=(Test)constructor.newInstance(new Object[]{1000});
  */
  
  
  
  Class class1=Class.forName("demo.Test");
  //  public Test(String name,int age)
//  Constructor constructor=class1.getConstructor(new Class[]{String.class,int.class});
//  Test test=(Test)constructor.newInstance("   ",22);
  
  //         
//  Constructor constructor=class1.getConstructor(null);
//  Test test=(Test)constructor.newInstance(null);

  //  private       
  Constructor constructor=class1.getDeclaredConstructor(new Class[]{int.class});
  constructor.setAccessible(true);
  Test test=(Test)constructor.newInstance(new Object[]{1000});
  test.display();
メンバーメソッドの操作
Class.get Method()とClass.get DecleadMethod()の方法を使用して、この2つの方法の違いは前に述べましたが、プライベートメンバーメソッドを呼び出す前に必ずアクセス権限を設定します。
Method類の他の方法も前に述べましたので、詳しく使ってみてください。

/*
   *   Method       :
   *  1.Method method_set=class1.getMethod("set", new Class[]{String.class,int.class});
   *  2.Method method_set=class1.getMethod("set", String.class,int.class);
   * 
   * 
   *   Method.invoke()         
   *  1.Object o=method_set.invoke(test, new Object[]{"   ",200});
   *  2.Object object=method_set.invoke(test, "   ",2000);
   */
  
  
  
  
  /*
   *       (public):
   *  1.Method method=class1.getMethod("display",null); //public void display()
   *  2.Method method_set=class1.getMethod("set", new Class[]{String.class,int.class}); //  public void set(String name,int age)
   * 
   * 
   *       (private,protected)
   *  1.Method method_getAge=class1.getDeclaredMethod("getAge", null);
   */
  
  
  //          Test  
  Class class1 =Class.forName("demo.Test");
  Constructor<Test> constructor=class1.getDeclaredConstructor(new Class[]{String.class,int.class});
  Test test=constructor.newInstance(new Object[]{"   ",22});
  
  
  Method method=class1.getMethod("display",null); //  public void display()   Method  
  Object obj=method.invoke(test, null); //    display
  
  //  public void set(String name,int age)
//  Method method_set=class1.getMethod("set", new Class[]{String.class,int.class});
  Method method_set=class1.getMethod("set", String.class,int.class);
  
//  Object o=method_set.invoke(test, new Object[]{"   ",200});
  Object object=method_set.invoke(test, "   ",2000);
  test.display();
  
  
  //      private int getAge()
  Method method_getAge=class1.getDeclaredMethod("getAge", null);
  method_getAge.setAccessible(true); //         true
  //          int   
  if("int".equals(method_getAge.getReturnType().toString()))
  {
   int ReturnData=(int) method_getAge.invoke(test, null); //         
   System.out.println(ReturnData);
  }
  
メンバー変数の操作
主に使うField類は、前にもう詳しく話しました。

/*
   *   public       :
   *  1.Field field=class1.getField("name"); //  public     name Filed  
   * 
   *   private,protected       :
   *  1. Field field2=class1.getDeclaredField("age");
   */
   
   
  Class class1=Class.forName("demo.Test");
  Test test=new Test("   ",1000);
  Field field=class1.getField("name"); //  public     name Filed  
  System.out.println(field.get(test)); //  test    name    
  
  //  private int age Field  
  Field field2=class1.getDeclaredField("age");
  field2.setAccessible(true); //      
  System.out.println(field2.get(test));
以上のように、常々Java反射機構(必見編)は小編が皆さんに提供している内容の全部です。参考にしていただければと思います。どうぞよろしくお願いします。