1. 程式人生 > >ReflectUitls類的編寫和對反射機制的解析

ReflectUitls類的編寫和對反射機制的解析

package com.mengdd.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

/**
 *
 * @ClassName ReflectUtils
 * @Description Reflection Helper class
 *
 * 
@author mengdandan * @Date 2014年5月13日上午10:40:32 * */ public class ReflectUtils { /** * 建立類的例項,呼叫類的無參構造方法 * * @param className * @return */ public static Object newInstance(String className) { Object instance = null; try { Class
<?> clazz = Class.forName(className); instance = clazz.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { // if this Class represents an abstract class, an interface, an
// array class, a primitive type, or void; or if the class has no // nullary constructor; or if the instantiation fails for some other // reason. e.printStackTrace(); } catch (IllegalAccessException e) { // if the class or its nullary constructor is not accessible e.printStackTrace(); } return instance; } /** * 獲取所有的public構造方法的資訊 * * @param className * @return */ public static String getPublicConstructorInfo(String className) { StringBuilder sBuilder = new StringBuilder(); try { Class<?> clazz = Class.forName(className); Constructor<?>[] constructors = clazz.getConstructors(); sBuilder.append(getConstructorInfo(constructors)); } catch (ClassNotFoundException e) { e.printStackTrace(); } return sBuilder.toString(); } /** * 得到本類內宣告的構造方法資訊 * * @param className * @return */ public static String getDeclearedConstructorInfo(String className) { StringBuilder sBuilder = new StringBuilder(); try { Class<?> clazz = Class.forName(className); Constructor<?>[] constructors = clazz.getDeclaredConstructors(); sBuilder.append(getConstructorInfo(constructors)); } catch (ClassNotFoundException e) { e.printStackTrace(); } return sBuilder.toString(); } /** * 獲取public的欄位資訊 * * @param className * @return */ public static String getPublicFieldInfo(String className) { StringBuilder sBuilder = new StringBuilder(); try { Class<?> clazz = Class.forName(className); Field[] fields = clazz.getFields(); sBuilder.append(getFieldInfo(fields)); } catch (ClassNotFoundException e) { e.printStackTrace(); } return sBuilder.toString(); } /** * 獲取本類內宣告的欄位資訊 * * @param className * @return */ public static String getDecleardFieldInfo(String className) { StringBuilder sBuilder = new StringBuilder(); try { Class<?> clazz = Class.forName(className); Field[] fields = clazz.getDeclaredFields(); sBuilder.append(getFieldInfo(fields)); } catch (ClassNotFoundException e) { e.printStackTrace(); } return sBuilder.toString(); } /** * 得到所有public方法資訊 * * @param className * @return */ public static String getPublicMethodInfos(String className) { StringBuilder sBuilder = new StringBuilder(); try { Class<?> clazz = Class.forName(className); Method[] methods = clazz.getMethods();// 得到所有的public方法,包括從基類繼承的 sBuilder.append(getMethodInfo(methods)); } catch (ClassNotFoundException e) { e.printStackTrace(); } return sBuilder.toString(); } /** * 得到類內宣告的方法資訊 * * @param className * @return */ public static String getDeclaredMethodInfos(String className) { StringBuilder sBuilder = new StringBuilder(); try { Class<?> clazz = Class.forName(className); Method[] methods = clazz.getDeclaredMethods();// 得到本類宣告的所有方法,包括私有方法 // clazz.getMethods(); 會返回所有public的方法,但是包括基類Object的方法 sBuilder.append(getMethodInfo(methods)); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return sBuilder.toString(); } /** * 得到構造器資訊 * * @param constructor * @return */ private static String getConstructorInfo(Constructor<?> constructor) { StringBuilder sBuilder = new StringBuilder(); sBuilder.append("name: " + constructor.getName()); sBuilder.append("\ngetParameterTypes: " + Arrays.toString(constructor.getParameterTypes())); return sBuilder.toString(); } /** * 將一組構造器的資訊組成一個字串返回 * * @param constructors * @return */ private static String getConstructorInfo(Constructor<?>[] constructors) { StringBuilder sBuilder = new StringBuilder(); int i = 0; for (Constructor<?> c : constructors) { sBuilder.append("method: " + ++i + " : "); sBuilder.append("\n" + getConstructorInfo(c)); sBuilder.append("\n"); } return sBuilder.toString(); } /** * 獲取欄位資訊,組成一個字串返回 * * @param field * @return */ private static String getFieldInfo(Field field) { StringBuilder sBuilder = new StringBuilder(); sBuilder.append("name: " + field.getName()); sBuilder.append("\ngetType: " + field.getType()); sBuilder.append(getModifiersInfo(field)); return sBuilder.toString(); } /** * 獲取一組欄位的資訊,返回字串 * * @param fields * @return */ private static String getFieldInfo(Field[] fields) { StringBuilder sBuilder = new StringBuilder(); int i = 0; for (Field field : fields) { sBuilder.append("field: " + ++i + " : "); sBuilder.append("\n" + getFieldInfo(field)); sBuilder.append("\n"); } return sBuilder.toString(); } /** * 獲取方法的資訊,組成一個字串返回 * * @param method * @return */ private static String getMethodInfo(Method method) { StringBuilder sBuilder = new StringBuilder(); sBuilder.append("name: " + method.getName()); sBuilder.append("\ngetReturnType: " + method.getReturnType()); sBuilder.append("\ngetParameterTypes: " + Arrays.toString(method.getParameterTypes())); sBuilder.append(getModifiersInfo(method)); return sBuilder.toString(); } /** * 獲取一組方法的資訊,組成一個字串返回 * * @param methods * @return */ private static String getMethodInfo(Method[] methods) { StringBuilder sBuilder = new StringBuilder(); int i = 0; for (Method method : methods) { sBuilder.append("method: " + ++i + " : "); sBuilder.append("\n" + getMethodInfo(method)); sBuilder.append("\n"); } return sBuilder.toString(); } /** * 獲取修飾符資訊 * * @param member * @return */ private static String getModifiersInfo(Member member) { StringBuilder sBuilder = new StringBuilder(); int modifiers = member.getModifiers(); sBuilder.append("\ngetModifiers: " + +modifiers + ", ");// 得到修飾符編碼 sBuilder.append("\nisPublic: " + Modifier.isPublic(modifiers) + ", "); sBuilder.append("\nisPrivate: " + Modifier.isPrivate(modifiers) + ", "); sBuilder.append("\nisStatic: " + Modifier.isStatic(modifiers) + ", "); sBuilder.append("\nisFinal: " + Modifier.isFinal(modifiers) + ", "); sBuilder.append("\nisAbstract: " + Modifier.isAbstract(modifiers)); return sBuilder.toString(); } /** * 是否是公用靜態方法 * * @param member * @return */ private static boolean isPublicStatic(Member member) { boolean isPS = false; int mod = member.getModifiers(); isPS = Modifier.isPublic(mod) && Modifier.isStatic(mod); return isPS; } /** * 呼叫靜態方法 * * @param className * @param methodName * @param paramTypes * @param params * @return * @throws Exception */ public static Object invokePublicStaticMethod(String className, String methodName, Class<?>[] paramTypes, Object[] params) throws Exception { Class<?> cls = Class.forName(className); Method method = cls.getMethod(methodName, paramTypes); Object value = null; if (isPublicStatic(method)) { value = method.invoke(null, params); } return value; } /* * wrong: * public static Object invokePublicStaticMethod(String className, * String methodName, Object[] params) throws Exception { * * Class<?> cls = Class.forName(className); * Class<?>[] paramTypes = new Class<?>[params.length]; * for (int i = 0; i < params.length; ++i) { * paramTypes[i] = params[i].getClass(); * * } * Method method = cls.getMethod(methodName, paramTypes); * Object value = null; * if (isPublicStatic(method)) { * value = method.invoke(null, params); * } * * return value; * } */ /** * 呼叫私有方法 * * @param obj * 呼叫類物件 * @param methodName * 方法名 * @param paramTypes * 引數型別 * @param params * 引數 * @return * @throws Exception */ public static Object invokePrivateMethod(Object obj, String methodName, Class<?>[] paramTypes, Object[] params) throws Exception { Object value = null; Class<?> cls = obj.getClass(); // 注意不要用getMethod(),因為getMethod()返回的都是public方法 Method method = cls.getDeclaredMethod(methodName, paramTypes); method.setAccessible(true);// 抑制Java的訪問控制檢查 value = method.invoke(obj, params); return value; } }

相關推薦

ReflectUitls類的編寫反射機制解析

package com.mengdd.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Member; import java.lang

Class物件Java反射機制

一 前言 很多書上都說,在java的世界裡,一切皆物件。其實從某種意義上說,在java中有兩種物件:例項物件和Class物件。例項物件就是我們平常定義的一個類的例項: /** * Created by aristark on 3/28/16. */ public class Person

Android中反射機制解析 API介紹 建立private構造方法類例項 反射內部類 使用demo

反射 前言 相關知識點 編譯型語言和解釋型語言 動態型別語言和靜態型別語言 反射(Reflection) Class Class類API Constructor類 AP

大資料專案實戰之六:6.工具類編說明

日期時間工具類 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 日期時間工具類 * @author Administrator * */ public

java反射機制解析

第1章 反射 1.1 類的載入 當程式要使用某個類時,如果該類還未被載入到記憶體中,則系統會通過載入,連線,初始化三步來實現對這個類進行初始化。  載入 就是指將class檔案讀入記憶體,併為之建立一個Class物件。 任何類被使用時系統都會建立一個Class物件  連線 驗證 是否有正

C++檔案的讀多行多個字串的處理

C++讀寫檔案中的字串 今天幫人做了個簡單的作業,沒想到花時間最多的不是演算法而是檔案的讀寫,還有對讀入字串的分割處理。晚上寫作業的時候又用到了對字串的處理,這裡記錄一下。 小白第一次寫部落格,做的不好的請多多指正。 題目如下: Retail.dat檔案中包含了某零售商店

工廠模式(Factory Pattern)java反射機制優化思考

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">GOF的工廠模式是最基礎的一種建立型設計模式,其適用於建立同一介面的不

ObjectC----NSObject常用方法OC反射機制

    // Created  By   郭仔  2015年04月11日17:13:22 NSObject常用方法: ========================================

HBase讀的機制

HBase寫機制 預設情況下,執行寫入時會寫到兩個地方:預寫式日誌(write-ahead log,也稱HLog)和MenStore。Hbase預設方式是把寫入動作記錄在這兩個地方,以保證資料持久化。只有當這兩個地方的變化資訊都寫入並確認後,才認為寫動作完

ElasticSearch termmatch查詢機制解析隱藏的查詢問題

2. 關於預設分析使用term查詢的問題 之前說過es的預設分析器會講中文拆分成一個個的單個漢子,搜尋條件“內科”會被分析為“內”和“科”,從而進行搜尋。而對於搜尋我們常用的match搜尋類似於資料庫的模糊查詢,term搜尋為精確查詢。使用的時候會出現以下

基於NACOSJAVA反射機制動態更新JAVA靜態常量非@Value註解

1.前言 專案中都會使用常量類檔案, 這些值如果需要變動需要重新提交程式碼,或者基於@Value註解實現動態重新整理, 如果常量太多也是很麻煩; 那麼 能不能有更加簡便的實現方式呢? 本文講述的方式是, 一個JAVA類對應NACOS中的一個配置檔案,優先使用nacos中的配置,不配置則使用程式中的預設值; 2

【java】java反射機制,動態獲取象的屬性對應的參數值,並屬性按照字典序排序,Field.setAccessible()方法的說明【可用於微信支付 簽名生成】

modifier 直接 this 字段值 1-1 讓我 toupper ima play 方法1:通過get()方法獲取屬性值 package com.sxd.test.controller; public class FirstCa{ private

利用反射機制建立工具類資料進行加密解密

對資料庫的資料進行加密,包括使用者資料、專案資料、聊天資料等,需要在插入表的的時候進行加密,查詢的時候進行解密。利用java的反射機制,建立以下工具類,對資料進行加解密。 public class CryptoUtil { /** * 加密、解密方法 * @param ob

spring二:Java反射獲取類物件資訊全解析

反射在這裡的作用就是知道全路徑 在框架啟動的時候把類例項化 然後設定到@service 和@Autowired裡面 所以要了解這東西怎麼用的 1. 什麼是類物件 類物件,就是用於描述這種類,都有什麼屬性,什麼方法的 2. 獲取類物件 獲取類物件有3種方式 (1). Class.f

java 利用反射機制,獲取實體所有屬性方法,並屬性賦值

Field[] field = model.getClass().getDeclaredFields(); // 獲取實體類的所有屬性,返回Field陣列 try { for (int j = 0; j < field.length; j++)

利用java反射機制,實現類的私有變數私有方法的訪問

記得有一句很有名的話:No reflection ,no frameworks 這一句短短的話道出了java 反射機制的強大。 java關於反射機制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基於java的反射機制。 下面是一個關於利用j

反射機制的概述字節碼象的獲取方式

文件中 ref str found 方法 row java語言 讓我 通過 1.1.1 反射介紹JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法對於任意一個對象,都能夠調用它的任意一個方法這種動態獲取的以及動態調用對象的方法的功能稱為java

通過java反射機制,獲取象的屬性值(包括所有繼承的父類)

原創 getc getname 因此 declared protect 版權 str 來源 java的反射機制提供了兩種方法: getDeclaredFields() :該方法能獲取到本類的所有屬性,包括private,protected和public,但不能獲取到

反射機制--調用構造函數成員方法、制作幫助文檔

port const center 分享 相關 src -- 知識 water 今天學習了關於反射的相關知識,通過反射能夠找到類中的構造方法和全部的成員方法。而並不了解這個類的構造的人能夠非常方便的運用反射機制。 掌握發射主要了解這幾個類,類位於java.long.re

Hibernate實體類編規則主鍵策略

有時 由於 rem 數據 數據類型 空間 存在 配置 hyper 一、實體類的編寫規則   1、屬性要是私有的。        2、要有公開的setter和getter方法供外界訪問和修改。        3、每一個實體類要有一個屬性作為唯一值(一般都是使用對於數據表的