1. 程式人生 > >java反射——對內部類的處理

java反射——對內部類的處理

Class類本身還提供對於獲取內部類位元組碼的方法,分別為getClasses和getDeclaredClasses(),其中getClasses()只能得到訪問級別為public的內部類,而getDeclaredClasses()則能得到所有聲明瞭的內部類。

由於內部類可以分為例項內部類,靜態內部類,匿名內部類,前面提到的getClasses()和getDeclaredClasses()目前還都只能得到例項內部類和靜態內部類,對於後面兩種情況卻無能為力,為此還需要採取一些特殊的手段才能針對匿名內部類進行反射操作

package net.csdn.blog;

public class ReflectInnerClass {


	
	public Runnable ta=new Runnable(){
		public void run(){
			System.out.println("匿名內部類中的方法被執行了");
		}
	};

	
	private class Inner2{
		public Inner2(){
			System.out.println("Inner2類被例項化了");
		}
	}
	
	class Inner3{
		public Inner3(){
			System.out.println("Inner2類被例項化了");
		}
	}	
	public class Inner1{
		public Inner1(){
			System.out.println("Inner1類被例項化了");
		}
	}
}

***對內部類反射**

package net.csdn.blog;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;

public class ReflectInnerClassTest {

	public static void main(String args[]){
		ReflectInnerClass ric=new ReflectInnerClass();
		try {
			reflectInnerClass(ric);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}

	private static void reflectInnerClass(ReflectInnerClass ric) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, NoSuchFieldException {
		Class clazz=ric.getClass();
		Class classes[]=clazz.getDeclaredClasses();
		for(Class c:classes){//對成員內部類進行反射
			int i=c.getModifiers();
			String s=Modifier.toString(i);
			if(s.contains("static"))//靜態內部類的處理
				 c.getConstructor().newInstance();
			else//例項內部類的處理
                 c.getConstructor(ric.getClass()).newInstance(ric);
		}
		//由於匿名內部類沒有構建器,因此無法建立例項,也無法直接訪問其中的方法,但可以通過下面的方式巧秒的執行其中的方法或成員變數。
		Runnable r=(Runnable)(clazz.getField("ta").get(ric));
	    r.run();
		
	}
}