Class類中的getEnclosingXX、getDeclaredXX
一、getEnclosingXX
getEnclosingClass():該類是在那個類中定義的, 比如直接定義的內部類或匿名內部類
getEnclosingConstructor():該類是在哪個建構函式中定義的,比如構造方法中定義的匿名內部類
getEnclosingMethod():該類是在哪個方法中定義的,比如方法中定義的匿名內部類
例項
package reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Method; /** * @author zhangquanit */ public class Outer { public Outer() { // 構造方法中的匿名內部類 InnerClass innerClass = new InnerClass() { @Override public void fun() { getEnclosing(this.getClass()); /** * enclosingClass=class reflect.Outer * enclosingConstructor=public reflect.Outer() * enclosingMethod=null */ } }; innerClass.fun(); } // 匿名內部類 static InnerClass innerClass = new InnerClass() { public void fun() { getEnclosing(this.getClass()); /** * enclosingClass=class reflect.Outer * enclosingConstructor=null * enclosingMethod=null */ }; }; public static void test() { // 方法中的匿名內部類 InnerClass innerClass = new InnerClass() { @Override public void fun() { getEnclosing(this.getClass()); /** * enclosingClass=class reflect.Outer * enclosingConstructor=null * enclosingMethod=public static void reflect.Outer.test() */ } }; innerClass.fun(); } // 內部類 public static class InnerClass { public InnerClass() { } public void fun() { } } public static void main(String[] args) { System.out.println("------內部類------"); getEnclosing(InnerClass.class); System.out.println("------匿名內部類------"); innerClass.fun(); System.out.println("------方法中的匿名內部類------"); Outer.test(); System.out.println("------建構函式中的匿名內部類------"); new Outer(); } /** * getEnclosingClass:該類是在那個類中定義的, 比如直接定義的內部類或匿名內部類 * getEnclosingConstructor:該類是在哪個建構函式中定義的,比如構造方法中定義的匿名內部類 * getEnclosingMethod:該類是在哪個方法中定義的,比如方法中定義的匿名內部類 * * @param cls */ private static void getEnclosing(Class cls) { Class enclosingClass = cls.getEnclosingClass(); Constructor enclosingConstructor = cls.getEnclosingConstructor(); Method enclosingMethod = cls.getEnclosingMethod(); System.out.println("enclosingClass=" + enclosingClass); System.out.println("enclosingConstructor=" + enclosingConstructor); System.out.println("enclosingMethod=" + enclosingMethod); } private static void getDecalared() { } }
二、getDeclaringClass
getDeclaringClass :獲取當前類定義所在的類.
package reflect; import java.util.Arrays; /** * @author zhangquanit */ public class Outer { // 內部類 public static class InnerClass { public InnerClass() { } public void fun() { } } // 內部介面 public interface InnerInterface { } public static void main(String[] args) { Class<?> declaringClass = InnerClass.class.getDeclaringClass(); System.out.println("InnerClass定義所在類為:"+declaringClass);//class reflect.Outer declaringClass =InnerInterface.class.getDeclaringClass(); System.out.println("InnerInterface定義所在類為:"+declaringClass);//class reflect.Outer } }
三、getDeclaredXX
獲取當前類中的成員。比如當前類中定義的內部類、建構函式、成員變數、方法。
// 1.獲取當前類中的所有類、介面、列舉、註解類等。 (不包括繼承的) Class<?>[] declaredClasses = Outer.class.getDeclaredClasses(); System.out.println(Arrays.toString(declaredClasses)); // 列印 [class reflect.Outer$InnerClass, interface reflect.Outer$InnerInterface] // 2.當前類上直接使用的註解 (不包括繼承的) Annotation[] declaredAnnotations = Outer.class.getDeclaredAnnotations(); System.out.println(Arrays.toString(declaredAnnotations)); // 列印 [@reflect.MyAnnotation(intValue=0)] // 3.當前類中的所有建構函式 (不包括繼承的) Constructor<?>[] declaredConstructors = Outer.class.getDeclaredConstructors(); System.out.println(Arrays.toString(declaredConstructors)); // 列印 [public reflect.Outer(int), public reflect.Outer()] // 4.當前類中的所有成員變數 (不包括繼承的) Field[] declaredFields = Outer.class.getDeclaredFields(); // Outer.class.getDeclaredField(name) System.out.println(Arrays.toString(declaredFields)); // 5.當前類中的所有方法 (不包括繼承的) Method[] declaredMethods = Outer.class.getDeclaredMethods(); // Outer.class.getDeclaredMethod(name, parameterTypes) System.out.println(Arrays.toString(declaredMethods));
相關推薦
Class類中的getEnclosingXX、getDeclaredXX
一、getEnclosingXX getEnclosingClass():該類是在那個類中定義的, 比如直接定義的內部類或匿名內部類 getEnclosingConstructor():該類是在哪個建構函式中定義的,比如構造方法中定義的匿名內部類 getEnclosingM
Java中Class類詳解、用法以及泛化
在前面我們將類的載入的時候,類載入一共有5步,載入,驗證,準備,解析和初始化。其中載入階段,除了將位元組碼載入到方法區,還生成了這個了的Java.lang.Class物件。那麼這個Class物件到底有什麼用呢? 前面的關於反射的文章,我們多次都用到了Class類,可以用這個
java.lang.Class類中的某些方法
getc 不定 sys etc .get out 類名 ont class類 反射的代碼會經常遇到,Class類中方法真的多,且用的少,大多用在底層源碼這塊,既然看到了,就記錄一下吧,說不定以後厲害了,自己封裝框架,haha getComponentType()方法: S
關於類中靜態、非靜態、構造方法的執行順序
幾大原則 一、靜態成員變數(Static) 1、靜態成員變數為類變數,所有物件共享同一記憶體空間 2、靜態成員變數的宣告和定義僅在首次載入類時執行一次 3、首次載入類時首先對所有靜態成員變數根據型別預設賦初值,然後再對有右值的附右值 二、靜態初始塊 1、靜態初始
Java-API-Class類詳解、用法及泛化
Java-API-Class類詳解、用法及泛化 轉載宣告: 本文系轉載自以下文章: Java中Class類詳解、用法及泛化 作者: 老白講網際網路 轉載僅為方便學習檢視,一切權利屬於原作者,本人只是做了整理和排版,如果帶來不便請聯絡我刪除。 0x01 摘要
有關Java實體類中get、set方法和有參無參構造方法的個人見解。
結論:(總的來說,get和set方法就是為了能以得到和設定實體類中的私有屬性值,而一個類中至少要有一個構造方法,當沒有人為新增的時候,編譯器會自動加入一個隱式的無參構造方法,當有人為新增時,編譯器就不會自動添加了。無參構造方法的作用是為了比較方便的new出一個物
es6 class類中的this指向
this指向 類的方法內部如果有this,預設指向類的例項。 但單獨使用該方法時,很可能會報錯。class Logger{ printName(name = 'there'){ this.print(`hello ${name}`);
Java中Class類中兩個值得注意的進行型別動態轉換的方法
Java中的Class類有兩個重要的方法:cast()和asSubclass()。這兩個方法都是用於Class類進行執行時(run-time)階段的型別轉換的。下面來看看他們的定義和使用: 第一個方法asSubclass() public <U> Clas
python的class(類)中的object是什麼意思?
python程式類的寫法中有的直接在class後價格名稱,有的卻在識別符號後加一個括號,裡面再嫁一個object,這是什麼意思呢?如下圖 原來 object是繼承的意思,面嚮物件語言中都有這樣一種特性。繼承,指一個物件直接使用另一物件的屬性和方法。 用程式碼說
通過Class類中的newInstance()和獲取getConstructor()有什麼區別?(反射)
通過反射操作構造方法建立物件: 步驟: 1.獲得Class物件 2獲得構造 3.通過構造物件獲得例項化物件 問題: 直接通過Class類中的newInstance()和獲取getConstructor()有什麼區別? newInstance()方法, 只能通過空參
Java中Calendar類中月、星期、日 是否要加減1及其原因
原文:http://blog.sina.com.cn/s/blog_45c06e600100pm77.html Java中對日期的處理需要用到Calendar類,其中有幾個方法在使用時需要新手注意。 1. 在獲取月份時,Calendar.MONTH + 1 的原因
php中class類中的詳細用法
一,php中類的建構函式和解構函式 1,建構函式用於初始化,用—construct()可以帶引數 2,解構函式不能帶引數,(用於在消去一個類之前執行一些操作或者功能),使用—destruct() 3,php不會自動呼叫父類的建構函式,(不支援建構函式過載),必須使用pare
C++中class類 的 建構函式、解構函式
說明: demo.cpp:main.cpp所在之處 Line.h:線段類的.h檔案 Line.cpp:線段類的.cpp檔案 Coordinate.h:座標類的.h檔案 Coordinate.cpp:
《Java虛擬機器原理圖解》1.3、class檔案中的訪問標誌、類索引、父類索引、介面索引集合
講完了class檔案中的常量池,我們就相當於克服了class檔案中最麻煩的模組了。現在,我們來看一下class檔案中緊接著常量池後面的幾個東西:訪問標誌、類索引、父類索引、介面索引集合 訪問標誌、類索引、父類索引、介面索引集合 在class檔案中的位置
全面解釋java中StringBuilder、StringBuffer、String類之間的關系
() 大於等於 修飾 軟件 進行 lan lin 字符 str StringBuilder、StringBuffer、String類之間的關系 java中String、StringBuffer、StringBuilder是編程中經常使用的字符串類,在上一篇博文中我們已
java中String類常用方法、屬性等
col clas equal ack length ++ ava eal rgs package Head18; public class java09 { public static void main(String[] args) { St
Java中泛型Class<T>、T與Class<?>
arraylist new 對象類型 創建 集合 spa div get 裏的 一.區別 單獨的T 代表一個類型 ,而 Class<T>代表這個類型所對應的類, Class<?>表示類型不確定的類 E - Element (在集合中使用,因為集合
java面向對象學習之——java中的類修飾符、成員變量修飾符、方法修飾符
16px 實例化 同時 pan 相同 nbsp 激活 fin ati 類修飾符: public(訪問控制符)——>將一個類聲明為公共類,他可以被任何對象訪問,一個程序的主類必須是公共類。abstract——>將一個類聲明為抽象類,沒有實現的方法,需要子類提供方法
Java:驗證在類繼承過程中equals()、 hashcode()、toString()方法的使用
red ger 輸出 ria oid nag println manage base 以下通過實際例子對類創建過程匯中常用的equals()、hashcode()、toString()方法進行展示,三個方法的創建過程具有通用性,在項目中可直接改寫。 //通過超類Employ
JavaSE8基礎 Class getDeclaredFields 獲取一個類中所有的成員變量
dsd scores ase sge 成員變量 demo 基礎 itcast 思考 禮悟: 好好學習多思考,尊師重道存感恩。葉見尋根三返一,活水清源藏於零。 虛懷若谷良心主,皓月當空自在王。願給最苦行無悔,誠勸且行且珍惜。