Java反射代碼塊

<span style="font-size:14px;">import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Properties;

public class Test_Reflection {

	public static void main(String[] args){
		//獲取對象
		//1.編譯器已經知道名字
		Class c1 = TestReflection.class;
		//2.已經的到類的實例對象
		TestReflection tf = new TestReflection();
		Class c2 = tf.getClass();
		//3.通過運行期獲取名字
		//Class c3 = Class.forName("test.TestReflection");
		
		//讀取屬性文件,在運行期獲取對象
		Class c3 = null;
		Properties p = new Properties();
		
		try {
			FileInputStream fis = new FileInputStream("prop.properties");
			p.load(fis);
			String className = p.getProperty("className");
			System.out.println(className);
			c3 = Class.forName(className);
			
			fis.close();
		} catch (IOException e) {

			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//==========================================================================================		
		//獲取指定包名
		String package1 = c1.getPackage().getName();
		String package3 = c3.getPackage().getName(); 
		System.out.println(package1 + "   " + package3);
		
//==========================================================================================		
		
		//獲取類權限修飾符
		int mod = c3.getModifiers();
		String modifier = Modifier.toString(mod);
		System.out.println("類的權限修飾符:" + modifier);
		
		//獲取完整類名
		String className = c3.getName();
		System.out.println("完整類名:" + className);
		
		//獲取父類
		Class superClass = c3.getSuperclass();
		System.out.println(Modifier.toString(superClass.getModifiers()) 
				+ " class " + superClass.getName());
		
		//獲取實現接口
		Class [] interfaces = c3.getInterfaces();
		for(Class t : interfaces){
			System.out.println(Modifier.toString(t.getModifiers()) 
					+ " interface " + t.getName());
		}
//==========================================================================================
		
		//獲取成員變量
		Field [] fds = c3.getDeclaredFields();
		
		for(Field field : fds){
			//獲取每個字段的訪問修飾符
			String mods = Modifier.toString(field.getModifiers());
			//獲取每個字段的類型
			Class type = field.getType();
			//得到類型名
			String typeName = type.getName();
			//得到字段名
			String fieldName = field.getName();
			
			//如果是數組,需要特殊處理一下
			if(type.isArray()){
				typeName = type.getComponentType().getName() + "[]";
			}
			
			System.out.println(mods + " " + typeName + " " + fieldName);
		}
		
//==========================================================================================	
		
		//獲取構造方法
		Constructor [] constructors = c3.getDeclaredConstructors();
		for(Constructor constructor : constructors){
			//獲取構造方法名
			String consName = constructor.getName();
			//獲取構造方法訪問修飾符
			String consModifier = Modifier.toString(constructor.getModifiers());
			
			//獲取構造方法中的參數
			Class [] paramTypes = constructor.getParameterTypes();
			
			System.out.print(consModifier + " " + consName + "(");
			//循環所有參數類型
			for(int i=0;i<paramTypes.length;i++){
				//如果第一個參數後需要加上逗號
				if(i > 0){
					System.out.print(", ");
				}
				//如果是數組需要特殊處理
				if(paramTypes[i].isArray()){
					System.out.print(paramTypes[i].getComponentType().getName() + "[]");
				}else{
					System.out.print(paramTypes[i].getName());
				}
			}
			System.out.println(")");
		}
		
//==========================================================================================	
		
		//獲取成員方法
		Method [] methods = c3.getDeclaredMethods();
		//遍歷所有成員方法
		for(Method m : methods){
			//獲取訪問修飾符
			String mMod = Modifier.toString(m.getModifiers());
			//獲取返回值類型
			Class mType = m.getReturnType();
			
			String returnType = "";
			if(mType.isArray()){
				returnType = mType.getComponentType().getName() + "[]";
			}else{
				returnType = mType.getName();
			}
			
			String mName = m.getName();
			
			System.out.print(mMod + " " + returnType + " " + mName + "(");
			
			//獲取參數列表
			Class [] paramTypes = m.getParameterTypes();
			for(int i=0;i<paramTypes.length;i++){
				if(i > 0){
					System.out.print(", ");
				}
				if(paramTypes[i].isArray()){
					System.out.print(paramTypes[i].getComponentType().getName() + "[]");
				}else{
					System.out.print(paramTypes[i].getName());
				}
			}
			
			System.out.println(")");
		}
//==========================================================================================
		//反射調用方法,可以通過Method類的invoke方法實現動態方法的調用
		//public Object invoke(Object obj,Object...args)
		//第一個參數代表對象
		//第二個參數開始,代表執行方法上的參數
		//若反射要調用類的某個私有方法,可以在這個私有方法對應的Method對象上先調用setAccessible(true)
		
		//之前已經獲取了c3的class對象,首先獲得實例化對象,然後對變量直接賦值查看結果
		try {
			//通過newInstance()方法獲取實例化對象
			//但是直接通過這種方法無法訪問帶參數的構造方法
			TestReflection trf = (TestReflection)c3.newInstance();
			trf.name = "張三";
			trf.password = "123456";
			trf.score = new int[3];
			trf.score[0] = 90;
			trf.score[1] = 91;
			trf.score[2] = 92;
			System.out.println("name=====" + trf.name);
			
			//通過構造方法同樣可以實例化對象
			//要調用帶參數的構造方法生成對象,可以使用下面的方式
			Constructor cons = c3.getConstructor(new Class[]{String.class,String.class});
			Object obj = cons.newInstance(new Object[]{"zhangsan","abcdefg"});
			TestReflection trf2 = ((TestReflection)obj);
			System.out.println("trf2-name=====" + trf2.name);
			System.out.println("trf2-password=====" + trf2.password);
			
			//注意:getDeclaredMethod()獲取的是類自身聲明的所有方法,
			//包括public,protected和private方法
			
			//getMethod()獲取的是類的所有共有方法,
			//意思是包括自身所有的public方法。以及從父類繼承,從接口實現的所有public方法
			
			//通過反射調用方法
			Method method1 = c3.getDeclaredMethod("setName", String.class);
			method1.invoke(trf, "李四");
			
			//通過反射調用帶數組參數的方法
			Method method2 = c3.getDeclaredMethod("setScore", new Class[]{int[].class});
			int [] nums = {1,2,3};
			method2.invoke(trf,new Object[]{nums});
			
			//通過反射調用private修飾的方法
			Method method3 = c3.getDeclaredMethod("setPassword", String.class);
			method3.setAccessible(true);
			method3.invoke(trf,"aabbccdd");
			
			System.out.println("name=====" + trf.name);
			System.out.println("scores====" + trf.score[0]);
			System.out.println("password=====" + trf.password);
			
			
			
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
</span>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章