今天在查看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;
分享到:
相关推荐
1、文件内容:easymock-javadoc-1.2-22.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/easymock-javadoc-1.2-22.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
VS2010旗舰版的VB.NET版本计算器软件主窗体代码Form1代码
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
水库调洪程序:精细化模拟同频率洪水放大过程,水库调洪、同频率放大洪水过程程序 ,核心关键词:水库调洪; 放大洪水过程程序; 同频率; 洪水管理。,"水库调度优化:同频洪水过程放大程序"
VS2010旗舰版的VB.NET版本FORM10代码
2025最新机械制图期末试卷及答案.doc
1、文件内容:felix-parent-1.2.1-15.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/felix-parent-1.2.1-15.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
C++17新年烟花代码(基于SFML3.0)
PicView
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
一种采用耦合电感的开关电路分析.pdf
2025十八项医疗核心制度题库及答案.docx
这个程序可以完美运行,对于小白来说可以用于学习进阶,可以在这个基础上进行增加各种算法实现,对于大学生来说可以直接用于课设、大作业、毕设等,有答疑支持,大家一起学习共同进步,共同成长,欢迎大家下载,用于学习,谢谢。
组词程序代码
7Zip Web标记绕过漏洞 (CVE-2025-0411)poc及MinGW-w64编译器
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
2025最新医疗三基三严考试试题及答案.doc
1代码
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1、文件内容:dnssec-trigger-0.11-22.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/dnssec-trigger-0.11-22.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装