1. 程式人生 > >Class類中的getEnclosingXX、getDeclaredXX

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));




相關推薦

ClassgetEnclosingXXgetDeclaredXX

一、getEnclosingXX getEnclosingClass():該類是在那個類中定義的, 比如直接定義的內部類或匿名內部類 getEnclosingConstructor():該類是在哪個建構函式中定義的,比如構造方法中定義的匿名內部類 getEnclosingM

JavaClass詳解用法以及泛化

在前面我們將類的載入的時候,類載入一共有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實體getset方法和有參無參構造方法的個人見解。

結論:(總的來說,get和set方法就是為了能以得到和設定實體類中的私有屬性值,而一個類中至少要有一個構造方法,當沒有人為新增的時候,編譯器會自動加入一個隱式的無參構造方法,當有人為新增時,編譯器就不會自動添加了。無參構造方法的作用是為了比較方便的new出一個物

es6 class的this指向

this指向     類的方法內部如果有this,預設指向類的例項。 但單獨使用該方法時,很可能會報錯。class Logger{     printName(name = 'there'){         this.print(`hello ${name}`);     

JavaClass兩個值得注意的進行型別動態轉換的方法

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()方法, 只能通過空參

JavaCalendar星期日 是否要加減1及其原因

原文:http://blog.sina.com.cn/s/blog_45c06e600100pm77.html Java中對日期的處理需要用到Calendar類,其中有幾個方法在使用時需要新手注意。 1. 在獲取月份時,Calendar.MONTH + 1 的原因

phpclass的詳細用法

一,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.3class檔案的訪問標誌索引索引介面索引集合

講完了class檔案中的常量池,我們就相當於克服了class檔案中最麻煩的模組了。現在,我們來看一下class檔案中緊接著常量池後面的幾個東西:訪問標誌、類索引、父類索引、介面索引集合 訪問標誌、類索引、父類索引、介面索引集合 在class檔案中的位置

全面解釋javaStringBuilderStringBufferString之間的關系

() 大於等於 修飾 軟件 進行 lan lin 字符 str StringBuilder、StringBuffer、String類之間的關系   java中String、StringBuffer、StringBuilder是編程中經常使用的字符串類,在上一篇博文中我們已

javaString常用方法屬性等

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 思考 禮悟: 好好學習多思考,尊師重道存感恩。葉見尋根三返一,活水清源藏於零。 虛懷若谷良心主,皓月當空自在王。願給最苦行無悔,誠勸且行且珍惜。