導航:首頁 > 編程語言 > java反射實現類

java反射實現類

發布時間:2023-01-29 20:00:19

『壹』 java中反射是什麼

JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。

Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。

Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。

(1)java反射實現類擴展閱讀:

JAVA中反射實例:

1、Class superClass=clazz.getSuperclass();//獲取父類。

System.out.println("getSuperclass:"+superClass)。

2、Class[] interfaces=clazz.getInterfaces();//獲取實現介面。

System.out.println("getInterfaces:"+interfaces.length)。

3、Constructor[] cons=clazz.getConstructors();//構造方法。

System.out.println("getConstructors:"+cons.length)。

參考資料來源:網路: JAVA反射機制

『貳』 Java的反射機制是什麼,如何實現

Java中的反射機制,通俗點解釋就是能夠在程序運行中動態獲取到內存中任一對象的信息,這些信息包括對象所屬類、類中的方法和屬性、以及它們的訪問控制域和返回值類型等等,還可以通過反射動態調用對象中的方法,而不管該方法的訪問域是私有或是公開,包括構造方法,還能實現動態代理等。總之,反射能夠破壞掉JAVA類本身的封裝性,進而獲取其私有的或公開的信息,也就能突破封裝進而調用私有的或公開的方法。
實現的話就是通過反射介面,JAVA把反射相關的類介面都封裝在了java.lang.reflect這個包中,你可以研究下這個包中的類,對於類的每一個屬性,如變數、方法,構造方法,這個包中都就與之相對應的類,通過這個類就可以操作這個屬性了。
java反射很強大,但也很危險,在實際開發中應少用或不用,在必要用之時,往往也能解決你遇到的問題。

『叄』 java反射怎麼實現的

Java中反射有如下幾種實現方式:
1、通過Class.forName()方法載入字元串,就可以得到該字元串做代表的Class對象。
2、通過類名調用class屬性得到該類的Class對象。
例如:Class<?> clazz = String.class也可以得到String類的Class對象。
3、調用實例的getClass()方法。
例如:Date date = new Date();
Class<?> clazz = date.getClass();
通過上邊的兩句代碼就可以得到date實例的Class對象。

『肆』 如何利用java反射構造一個類,使之實現一個介面和一些功能

可以實現,很方便。我去找個例子貼給你

Class FactoryClass = Class.forName(Name);
//Name是DAOFactory實現類的名字

// types of the constructor arguments
Class[] constrArgs = {Properties.class};

Object[] args = {Props};
//Props是Properties類型,它的內容來自一個配置文件
// get Constructor of this class with matching parameter types
Constructor<IDAOFactory> constructor = FactoryClass.getConstructor(constrArgs);

this.factory = constructor.newInstance(args);

『伍』 實用的Java反射工具類

反射的Utils函數集合

提供訪問私有變數 獲取泛型類型Class 提取集合中元素的屬性等Utils函數

package reflection

import java lang reflect Field import java lang reflect Modifier import java lang reflect ParameterizedType import java lang reflect Type import java util ArrayList import java util Collection import java util List

import mons beanutils PropertyUtils import mons lang StringUtils import slf j Logger import slf j LoggerFactory import springframework util Assert

/** * 反射的Utils函數集合 提供訪問私有變數 獲取泛型類型Class 提取集合中元素的屬性等Utils函數

* * @author lei */ public class ReflectionUtils {

private static Logger logger = LoggerFactory getLogger(ReflectionUtils class)

private ReflectionUtils() { }

/** * 直接讀取對象屬性值 無視private/protected修飾符 不經過getter函數

*/ public static Object getFieldValue(final Object object final String fieldName) { Field field = getDeclaredField(object fieldName)

if (field == null)

throw new IllegalArgumentException( Could not find field [ + fieldName + ] on target [ + object + ] )

makeAccessible(field)

Object result = null try { result = field get(object) } catch (IllegalAccessException e) { logger error( 不可能拋出的異常{} e getMessage()) } return result }

/** * 直接設置對象屬性值 無視private/protected修飾符 不經過setter函數

*/ public static void setFieldValue(final Object object final String fieldName final Object value) { Field field = getDeclaredField(object fieldName)

if (field == null)

throw new IllegalArgumentException( Could not find field [ + fieldName + ] on target [ + object + ] )

makeAccessible(field)

try { field set(object value) } catch (IllegalAccessException e) { logger error( 不可能拋出的異常 {} e getMessage()) } }

/** * 循環向上轉型 獲取對象的DeclaredField */ protected static Field getDeclaredField(final Object object final String fieldName) { Assert notNull(object object不能為空 ) return getDeclaredField(object getClass() fieldName) }

/** * 循環向上轉型 獲取類的DeclaredField */ @SuppressWarnings( unchecked )

protected static Field getDeclaredField(final Class clazz final String fieldName) { Assert notNull(clazz clazz不能為空 ) Assert hasText(fieldName fieldName ) for (Class superClass = clazz superClass != Object class superClass = superClass getSuperclass()) { try { return superClass getDeclaredField(fieldName) } catch (NoSuchFieldException e) { // Field不在當前類定義 繼續向上轉型 } } return null }

/** * 強制轉換fileld可訪問

*/ protected static void makeAccessible(final Field field) { if (!Modifier isPublic(field getModifiers()) || !Modifier isPublic(field getDeclaringClass() getModifiers())) { field setAccessible(true) } }

/** * 通過反射 獲得定義Class時聲明的父類的泛型參數的類型 如public UserDao extends HibernateDao<User> * * @param clazz * The class to introspect * @return the first generic declaration or Object class if cannot be * determined */ @SuppressWarnings( unchecked )

public static Class getSuperClassGenricType(final Class clazz) { return getSuperClassGenricType(clazz ) }

/** * 通過反射 獲得定義Class時聲明的父類的泛型參數的類型 如public UserDao extends * HibernateDao<User Long> * * @param clazz * clazz The class to introspect * @param index * the Index of the generic ddeclaration start from * @return the index generic declaration or Object class if cannot be * determined */

@SuppressWarnings( unchecked )

public static Class getSuperClassGenricType(final Class clazz final int index) {

Type genType = clazz getGenericSuperclass()

if (!(genType instanceof ParameterizedType)) { logger warn(clazz getSimpleName() + s superclass not ParameterizedType ) return Object class }

Type[] params = ((ParameterizedType) genType) getActualTypeArguments()

if (index >= params length || index < ) { logger warn( Index + index + Size of + clazz getSimpleName() + s Parameterized Type + params length) return Object class } if (!(params[index] instanceof Class)) { logger warn(clazz getSimpleName() + not set the actual class on superclass generic parameter ) return Object class } return (Class) params[index] }

/** * 提取集合中的對象的屬性 組合成List * * @param collection * 來源集合

* @param propertityName * 要提取的屬性名

*/ @SuppressWarnings( unchecked )

public static List fetchElementPropertyToList(final Collection collection final String propertyName) throws Exception {

List list = new ArrayList()

for (Object obj collection) { list add(PropertyUtils getProperty(obj propertyName)) }

return list }

/** * 提取集合中的對象的屬性 組合成由分割符分隔的字元串

* * @param collection * 來源集合

* @param propertityName * 要提取的屬性名

* @param separator * 分隔符

*/ @SuppressWarnings( unchecked )

lishixin/Article/program/Java/hx/201311/26718

閱讀全文

與java反射實現類相關的資料

熱點內容
有伺服器地址怎麼安裝軟體 瀏覽:659
安卓如何完全清除數據 瀏覽:690
安卓安卓證書怎麼信任 瀏覽:53
伺服器被攻擊如何解決 瀏覽:221
學霸變成程序員 瀏覽:881
c語言編譯錯誤fatalerror 瀏覽:441
ipv4內部伺服器地址怎麼分配 瀏覽:463
java線程安全的方法 瀏覽:950
重復命令畫梯形 瀏覽:164
在疫情就是命令 瀏覽:328
自己搭建一個什麼伺服器好玩 瀏覽:253
java基礎馬士兵 瀏覽:823
完美世界手游如何查看伺服器 瀏覽:859
光遇安卓與ios什麼時候互通 瀏覽:598
js如何運行時編譯 瀏覽:917
引力app在哪裡下載 瀏覽:609
編寫app如何得到錢 瀏覽:801
吉利汽車軟體放哪個文件夾安裝 瀏覽:223
多文件編譯c 瀏覽:543
頭頂加密後為什麼反而更稀疏 瀏覽:794