欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-13 09:17:55
...
  今天在查看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;
相关标签: java reflection