<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>
java reflect是什麼?讓我們一起來了解一下吧!
java reflect是反射機制,指在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的資訊以及動態調用對象的方法的功能稱爲java語言的反射機制。
實現反射的方法:
一、獲得類的資訊(獲得到的是類的全路徑資訊)
獲取類的資訊有三種方法:
1.使用class類的forName()方法獲取類的資訊
2.使用實例的getClass()獲取類的資訊
3.透過類名獲得類的資訊
二、使用類的資訊創建類
獲得類的資訊之後,可以使用reflect(反射)包下面的Field和Method類獲得類的屬性和方法,並對屬性和方法進行操作。
獲得類的全路徑名以後可以透過使用Class類中的getDeclaredMethod(String name, Class
getDeclaredField(String name)方法如下:
public class ClassUtils { /** * 獲取屬性字段 * @param clazz 類 * @param fieldName 屬性名稱 * @throws Exception */ public static void getDeclaredField(Class clazz, String fieldName) throws Exception{ System.out.println(clazz.getDeclaredField(fieldName)); }}public class ClassTest { public static void main(String[] args) { try { Class clazz = Class.forName("reflectdemo.SuperHero"); //測試公有屬性 ClassUtils.getDeclaredField(clazz, "ADDRESS"); //測試私有屬性 ClassUtils.getDeclaredField(clazz, "name"); } catch (Exception e) { e.printStackTrace(); } }}
getDeclaredFields()方法如下:
public class ClassUtils { /** * 遍歷clazz對象已有的成員變量 * @param clazz */ public static void getDeclaredFields(Class clazz){ Field[] fields = clazz.getDeclaredFields(); for (Field field: fields) { //如果要設定值,需要加入下面這句,反射對象在使用時不使用Java語言訪問檢查 //field.setAccessible(true); //直接打印Field System.out.println(field); //手動獲取變量類型和變量名稱 System.out.println(field.getType().getName() + " " +field.getName()); System.out.println("--------------------"); } }}public class ClassTest { public static void main(String[] args) { try { Class clazz = Class.forName("reflectdemo.SuperHero"); //遍歷成員變量 ClassUtils.getDeclaredFields(clazz); } catch (Exception e) { e.printStackTrace(); } }}