習得する必要があるJavaリフレクションメカニズムに関する知識のまとめ

巴扎黑
リリース: 2017-04-09 10:35:32
オリジナル
1785 人が閲覧しました
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为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)c1.newInstance();
}

2. クラスの動的ロードclasses

Class.forName (クラスの完全名) このメソッドは、クラスのタイプを表すだけではありません。 class ですが、動的にロードされた class も表します。コンパイル時にロードされるクラスは静的にロードされ、実行時にロードされるクラスは動的にロードされます。

3. メソッド情報を取得する

基本的なデータ型と void キーワードは、getame(); を通じてクラスの名前を取得できます。


クラス c1=String.class;
クラス c2=int.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());

mes=c. 0; i & lt;methods.Length; i ++) {
// 取得メソッドのメソッド
クラス ReturnType = メソッド [i] .GetRespe ();
SYSTEM.OUT.print ( ntype.getName () ;
(クラス class1:parameterTypes){
System.out.print(class1.getName()+",") ;
}
System.out.println(")");
}
}
public class Reflect Test {

public static void main (string [] args) {
string s = "ss"
classutil.printclassinfo; (s); メンバー変数情報

public static void printFiledInfo(Object o){

Class c=o.getClass();
' ' のメンバー変数情報

'' ‐ アウトアウトオーバーズ ‐ オーバー‐ ‐ ‐ ‐ and ‐ ‐ ‐ ‐ ‐ ‐ ‐ for (Field f:fileds){
// メンバー変数の型を取得します
Class filedType=f.getType();
-- System.out.println (filedType.getName()+" "+f.getName());


}
public static void main(String[] args){
String s="ss";
fo(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リフレクションメカニズムに関する知識のまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート