`
youngmaster
  • 浏览: 57179 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于 自省 | 内省 的理解

阅读更多

反射(reflect) 与 内省|自省(Introspector)

 

二者深层次的关联到底是什么呢?也许其本质俱为反射!

 

package com.youngmaster.Introspector;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.*;
import java.lang.reflect.Method;

public class myBeanIntrospector {
	public myBeanIntrospector() {
		try {
			// 实例化一个Bean
			Student beanObj = new Student();
			// 依据Bean产生一个相关的BeanInfo类
			BeanInfo bInfoObject = Introspector.getBeanInfo(beanObj.getClass(),
					beanObj.getClass().getSuperclass());
			// 定义一个用于显示的字符串
			String output = "";

			// 开始自省

			/*
			 * BeanInfo.getMethodDescriptors()
			 * 用于获取该Bean中的所有允许公开的成员方法,以MethodDescriptor数组的形式返回
			 * 
			 * MethodDescriptor类 用于记载一个成员方法的所有信息 MethodDescriptor.getName()
			 * 获得该方法的方法名字 MethodDescriptor.getMethod() 获得该方法的方法对象(Method类)
			 * 
			 * Method类 记载一个具体的的方法的所有信息 Method.getParameterTypes()
			 * 获得该方法所用到的所有参数,以Class数组的形式返回
			 * 
			 * Class..getName() 获得该类型的名字
			 */
			output = "内省成员方法:\n";
			MethodDescriptor[] mDescArray = bInfoObject.getMethodDescriptors();
			for (int i = 0; i < mDescArray.length; i++) {
				// 获得一个成员方法描述器所代表的方法的名字
				String methodName = mDescArray[i].getName();

				String methodParams = new String();
				// 获得该方法对象
				Method methodObj = mDescArray[i].getMethod();
				// 通过方法对象获得该方法的所有参数,以Class数组的形式返回
				Class[] parameters = methodObj.getParameterTypes();
				if (parameters.length > 0) {
					// 获得参数的类型的名字
					methodParams = parameters[0].getName();
					for (int j = 1; j < parameters.length; j++) {
						methodParams = methodParams + ","
								+ parameters[j].getName();
					}
				}
				output += methodName + "(" + methodParams + ")\n";
			}
			System.out.println(output);

			/*
			 * BeanInfo.getPropertyDescriptors()
			 * 用于获取该Bean中的所有允许公开的成员属性,以PropertyDescriptor数组的形式返回
			 * 
			 * PropertyDescriptor类 用于描述一个成员属性
			 * 
			 * PropertyDescriptor.getName() 获得该属性的名字
			 * 
			 * PropertyDescriptor.getPropertyType() 获得该属性的数据类型,以Class形式给出
			 */
			output = "内省成员属性:\n";
			PropertyDescriptor[] mPropertyArray = bInfoObject
					.getPropertyDescriptors();
			for (int i = 0; i < mPropertyArray.length; i++) {
				String propertyName = mPropertyArray[i].getName();
				Class propertyType = mPropertyArray[i].getPropertyType();
				output += propertyName + " ( " + propertyType.getName()
						+ " )\n";
			}
			System.out.println(output);

			/*
			 * BeanInfo.getEventSetDescriptors()
			 * 用于获取该Bean中的所有允许公开的成员事件,以EventSetDescriptor数组的形式返回
			 * 
			 * EventSetDescriptor类 用于描述一个成员事件
			 * 
			 * EventSetDescriptor.getName() 获得该事件的名字
			 * 
			 * EventSetDescriptor.getListenerType() 获得该事件所依赖的事件监听器,以Class形式给出
			 */
			output = "内省绑定事件:\n";
			EventSetDescriptor[] mEventArray = bInfoObject
					.getEventSetDescriptors();
			for (int i = 0; i < mEventArray.length; i++) {
				String EventName = mEventArray[i].getName();
				Class listenerType = mEventArray[i].getListenerType();
				output += EventName + "(" + listenerType.getName() + ")\n";
			}
			System.out.println(output);
			System.out.println("write by esonghui :)");

		} catch (Exception e) {
			System.out.println("异常:" + e);
		}
	}

	public static void main(String[] args) {
		new myBeanIntrospector();
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics