施用反射获取类的字段,方法信息

使用反射获取类的字段,方法信息
  今天在查看javax.mail包中相关类的信息时,想了解一下每一个类的属性,行为概要信息,以及它们之间的关联关系,本来eUML2可以看的,无奈试用过期了,又不想花银子,等找到好的Eclipse插件再说吧.

package com.pa.reflection;

import java.io.*;
import java.lang.reflect.*;

@SuppressWarnings("rawtypes")
public class ClassReflection {

	private static final String BLANK = " ";

	private static final String LEFT_BRACKET = "(";

	private static final String RIGHT_BRACKET = ")";

	private static final String THROWS = "throws";

	private static final String SEPARATE = ";";

	private static final String NEW_LINE = "\r\n";

	private static final String COMMA = ",";

	private static final String ARG = "arg";

	public static void getClassInfo(Class<?> clazz, Writer writer) {
		try {
			
			//获取构造函数信息
			StringBuffer constructorsResult = getConstructors(clazz);

			//获取字段信息
			StringBuffer fieldsResult = getFields(clazz);

			//获取方法信息
			StringBuffer methodsResult = getMethods(clazz);

			//最终结果
			StringBuffer finalResult = new StringBuffer();

			finalResult.append(constructorsResult).append(NEW_LINE);

			finalResult.append(fieldsResult).append(NEW_LINE);

			finalResult.append(methodsResult).append(NEW_LINE);

			//输出结果
			writer.write(finalResult.toString());

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (writer != null)
				try {
					writer.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
		}

	}

	private static StringBuffer getMethods(Class<?> clazz) {
		
		Method[] methods = clazz.getDeclaredMethods();
		beforeGetClassMethods(clazz,methods);
		StringBuffer methodsResult = new StringBuffer();
		if (methods != null && methods.length > 0) {
			for (Method method : methods) {
				methodsResult.append(addSuffixBlank(Modifier.toString(method.getModifiers())));
				methodsResult.append(addSuffixBlank(method.getReturnType().getCanonicalName()));
				methodsResult.append(method.getName());
				
				Class[] parameterTypes = method.getParameterTypes();
				
				getParameters(methodsResult, parameterTypes);

				Class[] exceptionTypes = method.getExceptionTypes();
				getExceptions(methodsResult, exceptionTypes);
				
				methodsResult.append(SEPARATE);
				methodsResult.append(NEW_LINE);
			}
		}
		afterGetClassMethods(clazz,methods);
		return methodsResult;
	}

	private static void afterGetClassMethods(Class<?> clazz,Method[] methods) {
		
	}

	private static void beforeGetClassMethods(Class<?> clazz,Method[] methods) {
		System.out.println("get "+clazz.getCanonicalName()+" methods,totoal size: "+methods.length);
	}

	/**
	 * 获取方法异常信息
	 * @param methodsResult
	 * @param exceptionTypes
	 */
	private static void getExceptions(StringBuffer methodsResult,Class[] exceptionTypes) {
		if (exceptionTypes != null && exceptionTypes.length > 0) {
			methodsResult.append(addSuffixBlank(THROWS));
			for (int j = 0; j < exceptionTypes.length; j++) {
				Class exceptionType = exceptionTypes[j];
				methodsResult.append(exceptionType.getCanonicalName());
				if (j != exceptionTypes.length - 1) {
					methodsResult.append(COMMA);
				} 
			}
		}
	}

	/**
	 * 获取方法参数信息
	 * @param methodsResult
	 * @param parameterTypes
	 */
	private static void getParameters(StringBuffer methodsResult,Class[] parameterTypes) {
		methodsResult.append(LEFT_BRACKET);
		if (parameterTypes != null && parameterTypes.length > 0) {
			for (int i = 0; i < parameterTypes.length; i++) {
				Class parameterType = parameterTypes[i];
				methodsResult.append(addSuffixBlank(parameterType.getCanonicalName())).append(ARG + (i + 1));
				if (i != parameterTypes.length - 1) {
					methodsResult.append(COMMA);
				} 
			}

		}
		methodsResult.append(RIGHT_BRACKET);
	}

	private static StringBuffer getFields(Class<?> clazz) {
		
		Field[] fields = clazz.getDeclaredFields();
		beforeGetClassFields(clazz,fields);
		StringBuffer fieldsResult = new StringBuffer();
		if (fields != null && fields.length > 0) {
			for (Field field : fields) {
				fieldsResult.append(addSuffixBlank(Modifier.toString((field.getModifiers()))));
				fieldsResult.append(addSuffixBlank(field.getType().getCanonicalName()));
				fieldsResult.append(field.getName());
				fieldsResult.append(SEPARATE);
				fieldsResult.append(NEW_LINE);
			}
		}
		afterGetClassFields(clazz,fields);
		return fieldsResult;
	}

	
	private static void afterGetClassFields(Class<?> clazz,Field[] fields) {
		
	}

	private static void beforeGetClassFields(Class<?> clazz,Field[] fields) {
		System.out.println("get "+clazz.getCanonicalName()+" fieds,totoal size: "+fields.length);
	}

	private static StringBuffer getConstructors(Class<?> clazz) {
		Constructor[] constructors = clazz.getDeclaredConstructors();
		beforeGetClassContructors(clazz,constructors);
		StringBuffer constructorsResult = new StringBuffer();
		if (constructors != null && constructors.length > 0) {
			for (Constructor constructor : constructors) {
				constructorsResult.append(addSuffixBlank(Modifier.toString(constructor.getModifiers())));
				constructorsResult.append(addSuffixBlank(constructor.getName()));
				
				Class[] parameterTypes = constructor.getParameterTypes();
				getParameters(constructorsResult, parameterTypes);
				
				Class[] exceptionTypes = constructor.getExceptionTypes();
				getExceptions(constructorsResult, exceptionTypes);

				constructorsResult.append(SEPARATE);
				constructorsResult.append(NEW_LINE);
			}
		}
		afterGetClassContructors(clazz,constructors);
		return constructorsResult;
	}

	private static void afterGetClassContructors(Class<?> clazz,Constructor[] constructors) {
		
	}

	private static void beforeGetClassContructors(Class<?> clazz,Constructor[] constructors) {
		System.out.println("get "+clazz.getCanonicalName()+" constructors,totoal size: "+constructors.length);
	}

	public static String addPrefix(String str, String prefix) {
		return prefix + str;
	}

	public static String addSuffix(String str, String suffix) {
		return str + suffix;
	}

	public static String addPrefixAndSuffix(String str, String prefix,
			String suffix) {
		return prefix + str + suffix;
	}

	public static String addSuffixBlank(String str) {
		return addSuffix(str, BLANK);
	}

	public static void main(String[] args) throws IOException {
		Writer writer = new PrintWriter(System.out);
		System.out.println("请输入你要反射的类(输入'exit'则退出):");
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		String destClass = null;
	    while(true){
	    	destClass = reader.readLine();
	    	if(destClass.equalsIgnoreCase("exit")){
	    		break;
	    	}
			try {
				Class clazz = Class.forName(destClass);
				getClassInfo(clazz, writer);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
	    }
		
	
	}
}


输出结果如下:
get javax.mail.Part constructors,totoal size: 0
get javax.mail.Part fieds,totoal size: 2
get javax.mail.Part methods,totoal size: 25

public static final java.lang.String ATTACHMENT;
public static final java.lang.String INLINE;

public abstract int getSize()throws javax.mail.MessagingException;
public abstract java.lang.String getFileName()throws javax.mail.MessagingException;
public abstract java.lang.Object getContent()throws java.io.IOException,javax.mail.MessagingException;
public abstract java.io.InputStream getInputStream()throws java.io.IOException,javax.mail.MessagingException;
public abstract java.lang.String getContentType()throws javax.mail.MessagingException;
public abstract void writeTo(java.io.OutputStream arg1)throws java.io.IOException,javax.mail.MessagingException;
public abstract void setText(java.lang.String arg1)throws javax.mail.MessagingException;
public abstract int getLineCount()throws javax.mail.MessagingException;
public abstract boolean isMimeType(java.lang.String arg1)throws javax.mail.MessagingException;
public abstract java.lang.String getDisposition()throws javax.mail.MessagingException;
public abstract void setDisposition(java.lang.String arg1)throws javax.mail.MessagingException;
public abstract java.lang.String getDescription()throws javax.mail.MessagingException;
public abstract void setDescription(java.lang.String arg1)throws javax.mail.MessagingException;
public abstract void setFileName(java.lang.String arg1)throws javax.mail.MessagingException;
public abstract javax.activation.DataHandler getDataHandler()throws javax.mail.MessagingException;
public abstract void setDataHandler(javax.activation.DataHandler arg1)throws javax.mail.MessagingException;
public abstract void setContent(javax.mail.Multipart arg1)throws javax.mail.MessagingException;
public abstract void setContent(java.lang.Object arg1,java.lang.String arg2)throws javax.mail.MessagingException;
public abstract java.lang.String[] getHeader(java.lang.String arg1)throws javax.mail.MessagingException;
public abstract void setHeader(java.lang.String arg1,java.lang.String arg2)throws javax.mail.MessagingException;
public abstract void addHeader(java.lang.String arg1,java.lang.String arg2)throws javax.mail.MessagingException;
public abstract void removeHeader(java.lang.String arg1)throws javax.mail.MessagingException;
public abstract java.util.Enumeration getAllHeaders()throws javax.mail.MessagingException;
public abstract java.util.Enumeration getMatchingHeaders(java.lang.String[] arg1)throws javax.mail.MessagingException;
public abstract java.util.Enumeration getNonMatchingHeaders(java.lang.String[] arg1)throws javax.mail.MessagingException;