JAva反射メカニズムの詳細
5081 ワード
JAva反射:実行状態では、いずれのクラスに対しても、このクラスのすべての属性と方法を知ることができます.いずれのオブジェクトに対しても、メソッドとプロパティを呼び出すことができます.
JAva反射クラスロードのライフサイクル:
プログラム実行中にJVMはマウント、リンク、初期化の3つのステップで完了します.クラスのロードはクラスローダによって完了する、ローダは.classファイルのバイナリファイルはJVMのメソッド領域にロードされ、このクラスを記述するjavaがスタック領域に作成される.lang.Classオブジェクト.しかし、同じクラスはクラスローダに以前のリンクのみロードされます.バイナリデータを実行可能な状態に組み立てることです.リンクには、検証、準備、解析の3つのフェーズ検証があります.通常、このバイナリ・ファイルが現在のJVM(バージョン)に適しているかどうかを確認するために使用されます.準備:静的メンバーにメモリ領域を割り当てることです.デフォルト値解析を設定します:定数プールのコードを直接参照として変換するプロセスを指し、すべてのシンボル参照が実行プログラムによって使用される(完全な対応関係を確立する)まで完了すると、タイプも初期化され、初期化後のクラスの対象は正常に使用され、1つのオブジェクトが使用されなくなるまでゴミが回収されます.スペースを解放します.クラスオブジェクトへの参照がない場合はアンインストールされ、クラスのライフサイクルが終了します.
Classファイルは静的フォーマットのバイナリストリームにすぎず、仮想マシンによってメモリ解析にロードされた後にのみ、実際の実行時の構造が生成されます.そのため、クラスロードメカニズムを明らかにすることは、Classファイルの各フィールドの意味を理解するのに役立つだけでなく、JAVAをより深く理解するのに役立ちます.
最後にjava反射クラスロードマップを添付し、より理解しやすい
JAva反射クラスロードのライフサイクル:
プログラム実行中にJVMはマウント、リンク、初期化の3つのステップで完了します.クラスのロードはクラスローダによって完了する、ローダは.classファイルのバイナリファイルはJVMのメソッド領域にロードされ、このクラスを記述するjavaがスタック領域に作成される.lang.Classオブジェクト.しかし、同じクラスはクラスローダに以前のリンクのみロードされます.バイナリデータを実行可能な状態に組み立てることです.リンクには、検証、準備、解析の3つのフェーズ検証があります.通常、このバイナリ・ファイルが現在のJVM(バージョン)に適しているかどうかを確認するために使用されます.準備:静的メンバーにメモリ領域を割り当てることです.デフォルト値解析を設定します:定数プールのコードを直接参照として変換するプロセスを指し、すべてのシンボル参照が実行プログラムによって使用される(完全な対応関係を確立する)まで完了すると、タイプも初期化され、初期化後のクラスの対象は正常に使用され、1つのオブジェクトが使用されなくなるまでゴミが回収されます.スペースを解放します.クラスオブジェクトへの参照がない場合はアンインストールされ、クラスのライフサイクルが終了します.
package com.bjhy.platform.criminal.search.report.test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import com.bjhy.platform.criminal.search.core.annotation.ColumnConfig;
/**
* java
* @author wbw
*
*/
public class MyReflect {
/**
*
* @param className
* @return
*/
public static String getClassName(Class<?> clzz){
return clzz.getName();
}
/**
* jvm ,
* @param clzz
* @return 、
*/
public static String getClassField(Class<?> clzz){
Field[] fields = clzz.getFields();
StringBuffer sb = new StringBuffer();
for(Field field :fields){
//
sb.append(field.getName());
//
sb.append(field.getType().getName());
sb.append(",");
}
String str = sb.substring(0, sb.length() - 1);
return str;
}
/**
*
* @param clzz
* @return
*/
public static String getSuperClassName(Class<?> clzz){
return clzz.getSuperclass().getName();
}
/**
*
* @param className
*/
public static void getStaticMethod(String className){
Class cls = null;
try {
cls = Class.forName(className);
Method sm = cls.getDeclaredMethod("hello", int.class,String.class);
sm.invoke(cls, 20,"xw");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* private
* @param className
*/
public static void setFieldValue(String className){
Class cls = null;
try {
cls = Class.forName(className);
Object user = cls.newInstance();
Field field = cls.getDeclaredField("name");
field.setAccessible(true);//
field.set(user, "xw");
System.out.println(field.get(user));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*
* java
* 1.Bootstrap ClassLoader c++ , 。
2.Extension ClassLoader , jre\lib\ext
3.AppClassLoader classpath , 。 java 。
* @param clzz
* @return
*/
public static String getClassLoader(Class<?> clzz){
return clzz.getClassLoader().getClass().getName();
}
/**
* , , , ,
*
* @author wbw
*
*/
class Factory{
/**
*
* @param className
* @return
*/
@SuppressWarnings("unused")
public User demo1(String className){
User user = null;
if(className.equals("normal")){
return user = new User();
}else if(className.equals("ammin")){
return user = new ManageUser();
}
return null;
}
/**
*
* @param className
* @return
*/
public User demo(String className) throws Exception{
return (User) Class.forName(className).newInstance();
}
}
/**
*
* @param clzz
* @return List<Map<String,Object>>
*/
public static List<LinkedHashMap<String,Object>> initAnnoFieldDic(Class<?> clzz){
// List<LinkedHashMap<String,Object>>
//LinkedHashMap<String,Object> key . ,value
List<LinkedHashMap<String,Object>> fieldList = new ArrayList<>();
LinkedHashMap<String,Object> valueMap = new LinkedHashMap<>();
// Fields
Field[] fields = clzz.getDeclaredFields();
// , @ColumnConfig
for (Field field : fields) {
if(field.isAnnotationPresent(ColumnConfig.class)){
//
String fieldNames = clzz.getSimpleName()+"."+field.getName();
//
ColumnConfig columnConfig = field.getAnnotation(ColumnConfig.class);
// code
if(valueMap.get(columnConfig.description())==null){
valueMap.put(fieldNames, columnConfig.description());
}
}
}
fieldList.add(valueMap);
return fieldList;
}
}
Classファイルは静的フォーマットのバイナリストリームにすぎず、仮想マシンによってメモリ解析にロードされた後にのみ、実際の実行時の構造が生成されます.そのため、クラスロードメカニズムを明らかにすることは、Classファイルの各フィールドの意味を理解するのに役立つだけでなく、JAVAをより深く理解するのに役立ちます.
最後にjava反射クラスロードマップを添付し、より理解しやすい