Java リフレクション メカニズム分析ガイド

黄舟
リリース: 2017-02-06 16:17:42
オリジナル
1260 人が閲覧しました

1. JAVA は動的言語ですか?

一般的に、動的言語というと、プログラムの実行中にプログラム構造や変数の型を変更できることを意味します。この観点から見ると、JAVA は C++ と同様に動的言語ではありません。

しかし、JAVA には、リフレクションという非常に顕著な動的関連メカニズムがあります。リフレクションを通じて、Java は実行時のコンパイル中に完全に合計されたクラスをロード、検出、使用したり、オブジェクト エンティティを生成したり、メソッドを呼び出したり、プロパティの値を設定したりできます。したがって、Java は半動的言語とみなされます。


リフレクションの概念:


Java のリフレクション メカニズムは、実行状態では、どのクラスでも、このクラスのすべてのプロパティとメソッドを知ることができることを意味します。オブジェクトは、そのメソッドのいずれかを呼び出すことができます。


情報を動的に取得し、オブジェクトのメソッドを動的に呼び出すこの機能は、Java 言語のリフレクション機構と呼ばれます


2. 動的性質


2.1.動的性質


● 実行時にオブジェクトインスタンスを生成する

● 実行時にプロパティを変更する


2.2. ●実行時に任意のオブジェクトが属するクラスを判断します

●実行時に任意のクラスのオブジェクトを構築します

●実行時に任意のクラスのメソッドと属性を判断します


●実行時に任意のオブジェクトのメソッドを呼び出します

●動的プロキシを生成します

2.3、Java リフレクション アプリケーションのシナリオ

Java プログラムでは、多くのオブジェクトが実行時に 2 つの型、つまりコンパイル時型と実行時型を持ちます

コンパイル時型はオブジェクトの宣言によって決まります。使用される型は次によって決まります。実行時に使用される型。実行時の型は、オブジェクトに実際に割り当てられた型によって決まります。例:

Person p =new Student();
ログイン後にコピー

型は、コンパイル時には person であり、実行時には Student を受け取ることもあります。外部から渡されるオブジェクトのコンパイル時型は Object ですが、プログラムはオブジェクトの実行時型のメソッドを呼び出す必要があります。これらの問題を解決するには、プログラムは実行時にオブジェクトとクラスに関する実際の情報を検出する必要があります。ただし、オブジェクトとクラスがどのクラスに属するかをコンパイル時に予測できず、プログラムがオブジェクトとクラスの実際の情報を検出するために実行時情報のみに依存する場合は、この時点でリフレクションを使用する必要があります

3 . Java Reflection API

Reflection API は、現在の JAVA 仮想マシンのクラス、インターフェイス、またはオブジェクトに関する情報を生成するために使用されます。

●クラスクラス:クラスの属性、メソッド、その他のコンテンツ情報を取得できるリフレクションのコアクラスです。

●フィールドクラス:Java.lang.reflect クラスの属性を表し、取得および設定できます。クラスの属性値。

●メソッドクラス:Java.lang.reflect。クラスのメソッドを表します。クラス内のメソッドに関する情報を取得したり、メソッド

Construcor クラス: Java.lang.reflect を実行したりするために使用できます。クラスのコンストラクター メソッドを表します。

4. すべてのメソッドと属性を取得します


パーソンクラス

package com.pb.Reflect.classinfo;

public class Person {
private String name;
private String gender;
private int age;

private Person() {
//
}
public Person(String name, String gender, int age) {
super();
this.name = name;
this.gender = gender;
this.age = age;
}
//getter、和setter方法
private String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

public String toString(){
return "姓名:"+name+"年龄: "+age;
}

}
ログイン後にコピー

リフレクションを使用します:

package com.pb.Reflect.classinfo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.swing.JOptionPane;

/*
* 通过用户输入类的全路径,来获取该类的成员方法和属性
* Declared获取全部不管是私有和公有
* 1.获取访问类的Class对象
* 2.调用Class对象的方法返回访问类的方法和属性信息
*/
public class ReflectDemo {

/*
* 构造方法
*/
public ReflectDemo(){
//用户输入类的全路径径
//使用String组件
String classpsth=JOptionPane.showInputDialog(null,"输入类的全路径");
//使用Class.forName方法根据输入的类的全路径 返回该类的Class对象
try {
Class cla = Class.forName(classpsth);
//利用Class对象的cla的自审,返回方法对象集合
Method [] method=cla.getDeclaredMethods(); //返回所有的方法
System.out.println("========获取方法信息============");
for (Method meth : method) {
//遍历method数组,并输出方法信息
System.out.println(meth.toString());
}
System.out.println("========获取出方法信息结束============");
//获取属性利用Class对象的cla的自审,返回成员属性对象集合
Field [] field=cla.getDeclaredFields();
System.out.println("========获取成员属性信息============");
for (Field f : field) {
System.out.println(f.toString());
}
System.out.println("========获取成员属性信息结束============");
//获取属性利用Class对象的cla的自审,返回构造方法集合
Constructor [] constructor=cla.getDeclaredConstructors();
System.out.println("========获取成员构造方法信息============");
for (Constructor constru : constructor) {
System.out.println(constru.toString());
}
System.out.println("========获取成员构造方法信息结束============");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("路径输入错误!");
}
}

}
ログイン後にコピー
package com.pb.Reflect.classinfo;

public class TestReflection {

public static void main(String[] args) {
ReflectDemo rd=new ReflectDemo();

}

}
ログイン後にコピー

com.pb.Reflect.classinfo.person

を入力します

結果:

========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取构造方法信息============
private com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取构造方法信息结束============
ログイン後にコピー

上記はJavaリフレクションメカニズムの分析ですガイド コンテンツ、その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!