反射(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();
}
}
分享到:
相关推荐
Java 自省类教程
Java 自省类教程
虚拟机自省技术实践.pdf
reflection 是一系列的API,它用于表示或者处理当前JVM中的类,接口和对象。
自省自查不断进步自主学习主题班会PPT课件(带内容).pptx
什么是自省? 在日常生活中,自省(introspection)是一种自我检查行为。 在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么、它知道...最好的理解自省就是通过例子: Type introspection 这里是各种编程
"互联网+"时代下,团队日益成为工作任务...研究数据表明,团队心理安全会增加团队自省性,团队自省性能够有效提高团队绩效。因此,企业应提高团队心理安全水平,降低人际关系风险,增强团队自省性对团队绩效的正向促进作用。
宅出来的自省
iBATIS的安装过程快速而简单。它是一个类库,而不是应用程序,所以实际上并不需要安装,但要在应用程序中使用它还是要经过几个步骤。 如果您熟悉C#和ADO.NET,那么可能需要好好阅读本章为下面的一两章做好准备。...
Java自省类教程.pdf
自问自省记录参考.doc
师德师风自查自纠自省.doc
pgi, ( 实验/无维护) gtk+/for自省绑定 PGI - 纯 python GObject内省绑定GObject自省绑定使用 ctypes 和 cffi ( 可选) 在纯 python 中编写。 API与 PyGObject 兼容。开发状态:警告:没有实现/支持许多内容。查看
初中语文文摘生活母爱的自省
初中语文文摘历史齐白石晚年自省
某些GraphQL API禁用了自省功能。 例如, ,则。 禁用内省后,Clairvoyance允许我们获取GraphQL API模式。 它以JSON格式生成模式,适用于其他工具,例如 , 或 。 安装 $ git clone ...
【不该遗忘的自省阅读答案】八十八分琦君阅读答案.docx
自省的奖励精品报告2020.pdf
研究生思想汇报:自省自律,拒腐防变