天天看點

java開發之構造方法的反射應用

Constructor類代表某一個類中的一個構造方法

得到某個類的所有構造方法:

Constructor<?>[] constructors = String.class.getConstructors();
           

得到某一個構造方法:

Constructor<String> constructor = String.class.getConstructor(StringBuffer.class);</span>
           

建立執行個體對象:

通常方法:

String str = new String(new StringBuffer("abc"));
           

反射方法:

String str = constructor.newInstance(new StringBuffer("abc"));
           

私有的構造方法:

我們知道一個對象如果将構造方法私有化,那麼就隻能從内部來執行個體化該對象,其實不然,通過反射,我們仍然可以從外部來執行個體化該對象

得到某個類私有的構造方法:

Constructor<Test> constructor = Test.class.getDeclaredConstructor();
           

這樣就可以擷取到這個類的無參數的私有構造方法,但是我們雖然擷取到了它的構造方法,但是我們不能直接使用它來執行個體化對象

要使用constructor.setAccessible(true);之後才能執行個體化該對象

建立執行個體對象:

public class Test{
	private Test(){}
}
           
try {
			Constructor<Test> constructor = Test.class.getDeclaredConstructor();
			constructor.setAccessible(true);
			Test test = constructor.newInstance();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
           

内部類的反射:

一個内部類的執行個體化是依靠外部類的,即先有外部類才有内部類,其實内部類的構造方法的第一個參數就是外部類

内部類的執行個體化:

public class Test{
	private Test(){}
	class Test1{
		
	}
}
           
try {
			Constructor<Test> constructor = Test.class.getDeclaredConstructor();
			constructor.setAccessible(true);
			Test test = constructor.newInstance();
			
			Constructor<Test1> constructor1 = Test1.class.getDeclaredConstructor(Test.class);
			Test1 test1 = constructor1.newInstance(test);
			
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
           

Android開發交流群:245461612