`
huxiaojun_198213
  • 浏览: 103488 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多
  今天在查看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自定义注解使用反射获取字段注解

    这里,`@Retention(RetentionPolicy.RUNTIME)` 表示该注解会在运行时保留,以便于反射获取;`@Target(ElementType.FIELD)` 指定注解可以应用于字段。 接下来,我们可以创建一个类并使用自定义注解标记某个字段: `...

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    在Java编程中,注解...这个示例涵盖了Java中使用反射获取注解的基本操作,包括类、方法、注解的值和方法参数。通过实践这个例子,你可以更好地理解和掌握这些概念,从而在实际项目中更有效地利用注解和反射。

    通过反射获得实体类的字段和值

    在深入探讨如何通过反射获取实体类的字段和值之前,我们先来理解一下反射是什么以及它在.NET框架中的作用。反射是一种强大的编程技术,允许运行时动态地获取类型的信息并操作对象。它提供了对程序集、模块、类型、...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    这些代码可能包括创建枚举类,然后通过反射获取枚举值、实例名以及演示如何使用`getDeclaredConstructor()`和`newInstance()`方法来访问私有构造函数(虽然这不是常规用法)。 通过深入理解这些概念,你可以更好地...

    frida反射调用对象中的方法与字段.pdf

    当需要使用反射调用某个对象的方法或访问其字段时,可以通过Frida的`Java.use`方法获取到对应的类的代理对象,然后通过调用其方法来实现。例如,在Frida脚本中可以使用`classObject.getDeclaredField("fieldName")....

    java反射获取所有属性,获取所有get方法,包括子类父类

    在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细介绍这些内容。 1. **获取所有属性**: 在Java中,`java.lang.Class` 类提供了获取类属性的方法。...

    java 利用反射获取内部类静态成员变量的值操作.docx

    在Java编程中,反射是一个非常强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够创建和操作对象。本文将详细介绍如何使用Java反射技术来获取内部类中的静态成员变量的值。 #### 二、背景...

    用反射的方式获取父类中的所有属性和方法

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部结构,包括类的属性、方法以及构造器。...通过上述步骤,你可以有效地利用反射获取和操作类的父类属性和方法。

    java反射,获取所有属性、方法以及List集合类

    这些`Field`对象提供了设置和获取字段值的能力,通过`set()`和`get()`方法。 ```java Class&lt;?&gt; clazz = Class.forName("com.example.YourClass"); Field[] fields = clazz.getDeclaredFields(); for (Field ...

    java 反射得到某个方法

    一旦有了Class对象,我们就可以通过它来获取类的构造器、方法、字段等信息。对于题目中的需求,获取特定方法,我们可以使用`getMethods()`或者`getMethod(String name, Class&lt;?&gt;... parameterTypes)`方法。 `...

    反射获取属性调用方法反射获取属性调用方法

    - `TestReflect`可能是一个测试类,用于演示如何使用反射获取属性和调用方法。 以上就是反射获取属性和调用方法的基本概念、实现方式以及相关应用场景。掌握反射技术,能让你在编程中更加灵活,解决许多设计难题。

    java反射机制学习(三):通过反射获取实体类的属性、方法、接口和父类信息

    在本教程中,我们将深入探讨如何通过反射获取实体类的属性、方法、接口以及父类信息。 首先,让我们从`Person.java`这个实体类开始。在Java中,实体类通常用于表示数据对象,比如一个用户或者订单。实体类可能包含...

    反射工具类 + 自定义的用于标注字段含义的注解.zip

    ReflectionUtils :反射工具类,包括 --- 通过反射获取实体类中的字段及其中文注释 --- 通过字段名称获得对象中对应的值 ...ColumnExplain: 使用在实体类字段上,用于标注字段含义,且可以通过反射获取含义

    java反射给指定字段赋值

    2. **获取字段**:通过`getDeclaredField(String fieldName)`方法获取了类`A`中的名为`"x"`的字段。 3. **设置可访问性**:调用`setAccessible(boolean flag)`方法,将该字段的可访问性设置为`true`。这一步非常重要...

    C#net反射实现访问类中的私有变量或者方法

    - **获取私有字段信息**:通过`GetField`方法,并传入`BindingFlags.NonPublic`和`BindingFlags.Instance`标志,以获取私有字段`myValue`的信息。 - **设置私有字段的值**:使用`SetValue`方法将`myValue`字段的值从...

    Java常用的反射方法

    反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有public修饰符的成员变量 3.2 获取指定字段并赋值 3.3 获取...

    C#使用反射机制获取类信息

    ### C#中使用反射机制获取类信息 #### 反射机制概述 反射是.NET框架提供的一种强大工具,它允许程序在运行时动态地获取类型的信息并进行操作。这些信息包括类型名称、方法、属性等。此外,反射还支持动态创建和...

    通过反射获取类的实例

    在本篇中,我们将深入探讨如何通过反射获取类的实例,以及相关的源码分析。 首先,我们需要了解`java.lang.Class`类。它是Java中的一个核心类,代表运行时的类信息。我们可以通过以下几种方式获取`Class`对象: 1....

    一个Java反射工具类,可以完成查询字段值以及设置字段值的功能

    一个Java反射工具类,可以完成查询字段值以及设置字段值的功能。

    通过反射获取类和方法.zip

    在Java中,反射API提供了一种方式,使我们能够在运行时动态地获取关于类、接口、字段和方法的信息,甚至能够创建和调用对象的方法。这在很多场景下非常有用,比如在框架开发、元编程、测试以及处理不确定类型的对象...

Global site tag (gtag.js) - Google Analytics