JAva反射メカニズムの詳細

5081 ワード

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反射クラスロードマップを添付し、より理解しやすい