1. 程式人生 > >三個例子講清楚Java反射

三個例子講清楚Java反射

package com.ccy.reflective;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.junit.Test;


/**
 * <p> 
 * Title: ReflectiveTest.java 
 * Package com.ccy.reflective 
 * </p>
 * <p>
 * Description: 反射API測試類
 * <p>
 * @author Tom.Cai
 * @created 2015-12-10 下午10:30:12 
 * @version V1.0 
 *
 */
public class ReflectiveTest {
	/**
	 * 反射獲取類資訊
	 */
	@Test
	public void reflectiveGetClassInfo(){
		try {
			Class cls = Class.forName("java.lang.String");
			//獲取父類
			Class superclass = cls.getSuperclass();
			System.out.println(superclass.getName());
			//獲取類的修飾符
			int modify = cls.getModifiers();
			String retval = Modifier.toString(modify);
		    System.out.println(retval);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 反射獲取類的建構函式
	 */
	@Test
	public void reflectiveGetConstructors(){
		try {
			Class cls = Class.forName("java.lang.String");
			//獲取構造方法
		    Constructor<String>[] declaredConstructors = cls.getDeclaredConstructors();
		    for(Constructor<String> con:declaredConstructors){
		    	//獲取構造方法的名稱
		    	String name = con.getName();
		    	System.out.println(name);
		    	//獲取構造方法的修飾符
		    	int conModify = con.getModifiers();
		    	String conRetval = Modifier.toString(conModify);
		    	System.out.println(conRetval);
		    	//迴圈獲取建構函式的引數
		    	Class<?>[] parameterTypes = con.getParameterTypes();
		    	for(int i = 0;i<parameterTypes.length;i++){
		    		System.out.println(parameterTypes[i].getName());
		    	}
		    	 System.out.println("------");
		    }
		    
		    
		    
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 反射獲取類的欄位
	 */
	@Test
	public void reflectiveGetClassFields(){
		try {
			Class cls = Class.forName("java.lang.String");
			Field[] fields = cls.getDeclaredFields();
			for(Field f:fields){
				//獲取欄位型別名稱
				Class<?> type = f.getType();
				String typeName = type.getName();
				System.out.println(typeName);
				
				//獲取欄位修飾符
				int modify = f.getModifiers();
				String modifyName = Modifier.toString(modify);
				System.out.println(modifyName);
				
				//獲取欄位名稱
				String filedName = f.getName();
				System.out.println(filedName);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 反射獲取類方法資訊
	 */
	@Test
	public void reflectiveGetClassMethods(){
		try {
			Class cls = Class.forName("java.lang.String");
			Method[] declaredMethods = cls.getDeclaredMethods();
			for(Method m:declaredMethods){
				//獲取還回型別名稱
				Class<?> returnType = m.getReturnType();
				String returnTypeName = returnType.getName();
				System.out.println(returnTypeName);
				
				//獲取方法修飾符
				int modifiers = m.getModifiers();
				String modifiersName = Modifier.toString(modifiers);
				System.out.println(modifiersName);
				
				//迴圈獲取引數型別名稱
				Class<?>[] parameterTypes = m.getParameterTypes();
				for(int i=0;i<parameterTypes.length;i++){
					String parameterName = parameterTypes[i].getName();
					System.out.println(parameterName);
				}
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}	
	}
}

ReflectiveTest2.java(執行時反射獲取字private段屬性值)