Java:反射メカニズムの分析

以前、文字列を介してクラスのメソッドを呼び出すことができるかどうかという質問について考えました。Baiduは、私が望む機能を実現するために、長い間反射メカニズムを使用してきました。

私の問題の解決策を見てみましょう:

// 通过包名.类名得到Class对象
String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
// 通过demo对象获取实例
HashMap<String, String> hashMap = (HashMap<String, String>) demo.newInstance();
		
// 调用自带的put函数
hashMap.put("a", "1");
System.out.println("=========put函数调用后=========");
System.out.println(hashMap);
		
// 通过反射机制,得到remove方法
Method method = demo.getDeclaredMethod("remove", Class.forName("java.lang.Object"));
// 调用remove方法
method.invoke(hashMap, "a");
System.out.println("=========通过反射remove函数调用后=========");
System.out.println(hashMap);

プログラムの実行結果:

=========put函数调用后=========
{a=1}
=========通过反射remove函数调用后=========
{}

Javaのリフレクションメカニズムで何ができるかを理解しています。

メソッド名を取得する

String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
Method[] methods = demo.getDeclaredMethods();
for (Method method : methods) {
	System.out.println(method);
}

プログラムの実行結果:

public java.lang.Object java.util.HashMap.remove(java.lang.Object)
public boolean java.util.HashMap.remove(java.lang.Object,java.lang.Object)
public java.lang.Object java.util.HashMap.get(java.lang.Object)
......

属性を取得する

String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
Field[] fields = demo.getDeclaredFields();
for (Field field : fields) {
	System.out.println(field);
}

プログラムの実行結果:

private static final long java.util.HashMap.serialVersionUID
static final int java.util.HashMap.DEFAULT_INITIAL_CAPACITY
static final int java.util.HashMap.MAXIMUM_CAPACITY
......

親クラスを取得する

String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
System.out.println(demo.getSuperclass());

プログラムの実行結果:

class java.util.AbstractMap

クラスコンストラクターを呼び出す

String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
// 通过demo对象获取实例
HashMap<String, String> hashMap = (HashMap<String, String>) demo.newInstance();

newInstance()はコンストラクターを呼び出すためのものであり、引数なしのコンストラクターが呼び出されます。パラメーターを運ぶ必要がある場合は、直接追加するだけです。

考えてみてください。xmlに依存する多くのJ2EEフレームワークは、リフレクションメカニズムを使用する場合があります。

おすすめ

転載: blog.csdn.net/new_Aiden/article/details/51756854