`

java 自省 使用

 
阅读更多
  1. import javax.swing.*;  
  2. import java.awt.*;  
  3. import java.awt.event.*;  
  4. import java.beans.*;  
  5. import java.io.*;  
  6. import java.lang.reflect.Method;  
  7. public class myBeanIntrospector  
  8. {  
  9.  public myBeanIntrospector()  
  10.  {  
  11.   try  
  12.   {  
  13.    //实例化一个Bean  
  14.    Student beanObj = new Student();  
  15.    //依据Bean产生一个相关的BeanInfo类  
  16.    BeanInfo bInfoObject =   
  17.    Introspector.getBeanInfo(beanObj.getClass(),beanObj.getClass().getSuperclass());  
  18.    //定义一个用于显示的字符串  
  19.    String output = "";  
  20.   
  21.    //开始自省  
  22.    
  23.    /* 
  24.    * BeanInfo.getMethodDescriptors() 
  25.    * 用于获取该Bean中的所有允许公开的成员方法,以MethodDescriptor数组的形式返回 
  26.    * 
  27.    * MethodDescriptor类 
  28.    * 用于记载一个成员方法的所有信息 
  29.    * MethodDescriptor.getName() 
  30.    * 获得该方法的方法名字 
  31.    * MethodDescriptor.getMethod() 
  32.    * 获得该方法的方法对象(Method类) 
  33.    * 
  34.    * Method类 
  35.    * 记载一个具体的的方法的所有信息 
  36.    * Method.getParameterTypes() 
  37.    * 获得该方法所用到的所有参数,以Class数组的形式返回 
  38.    * 
  39.    * Class..getName() 
  40.    * 获得该类型的名字 
  41.    */  
  42.    output = "内省成员方法:\n";  
  43.    MethodDescriptor[] mDescArray = bInfoObject.getMethodDescriptors();  
  44.    for (int i=0;i<mDescArray.length ;i++ )  
  45.    {  
  46.     //获得一个成员方法描述器所代表的方法的名字  
  47.     String methodName = mDescArray[i].getName();  
  48.       
  49.     String methodParams = new String();  
  50.     //获得该方法对象  
  51.     Method methodObj = mDescArray[i].getMethod();  
  52.     //通过方法对象获得该方法的所有参数,以Class数组的形式返回  
  53.     Class[] parameters = methodObj.getParameterTypes();  
  54.     if (parameters.length>0)  
  55.     {  
  56.      //获得参数的类型的名字  
  57.      methodParams = parameters[0].getName();  
  58.      for (int j=1;j<parameters.length ;j++ )  
  59.      {  
  60.       methodParams = methodParams + "," + parameters[j].getName();  
  61.      }  
  62.     }  
  63.     output += methodName + "(" + methodParams + ")\n";  
  64.    }  
  65.    System.out.println(output);  
  66.    
  67.    /* 
  68.    * BeanInfo.getPropertyDescriptors() 
  69.    * 用于获取该Bean中的所有允许公开的成员属性,以PropertyDescriptor数组的形式返回 
  70.    * 
  71.    * PropertyDescriptor类 
  72.    * 用于描述一个成员属性 
  73.    * 
  74.    * PropertyDescriptor.getName() 
  75.    * 获得该属性的名字 
  76.    * 
  77.    * PropertyDescriptor.getPropertyType() 
  78.    * 获得该属性的数据类型,以Class的形式给出 
  79.    * 
  80.    */  
  81.    output = "内省成员属性:\n";  
  82.    PropertyDescriptor[] mPropertyArray = bInfoObject.getPropertyDescriptors();  
  83.    for (int i=0;i<mPropertyArray.length ;i++ )  
  84.    {  
  85.     String propertyName = mPropertyArray[i].getName();  
  86.     Class propertyType = mPropertyArray[i].getPropertyType();  
  87.     output += propertyName + " ( " + propertyType.getName() + " )\n";  
  88.    }  
  89.    System.out.println(output);  
  90.    
  91.   
  92.    /* 
  93.    * BeanInfo.getEventSetDescriptors() 
  94.    * 用于获取该Bean中的所有允许公开的成员事件,以EventSetDescriptor数组的形式返回 
  95.    * 
  96.    * EventSetDescriptor类 
  97.    * 用于描述一个成员事件 
  98.    * 
  99.    * EventSetDescriptor.getName() 
  100.    * 获得该事件的名字 
  101.    * 
  102.    * EventSetDescriptor.getListenerType() 
  103.    * 获得该事件所依赖的事件监听器,以Class的形式给出 
  104.    * 
  105.    */  
  106.    output = "内省绑定事件:\n";  
  107.    EventSetDescriptor[] mEventArray = bInfoObject.getEventSetDescriptors();  
  108.    for (int i=0;i<mEventArray.length ;i++ )  
  109.    {  
  110.     String EventName = mEventArray[i].getName();  
  111.     Class listenerType = mEventArray[i].getListenerType();  
  112.     output += EventName + "(" + listenerType.getName() + ")\n";  
  113.    }  
  114.    System.out.println(output);  
  115.    System.out.println("write by esonghui :)");  
  116.    
  117.   }  
  118.   catch (Exception e)  
  119.   {  
  120.    System.out.println("异常:" + e);  
  121.   }  
  122.  }  
  123.  public static void main(String[] args)   
  124.  {  
  125.   new myBeanIntrospector();  
  126.  }  

分享到:
评论

相关推荐

    Java 自省类教程.rar

    总之,Java自省是Java编程中不可或缺的一部分,它极大地增强了程序的灵活性和动态性,但也需要谨慎使用,以避免性能损失和安全性问题。在学习和使用过程中,理解并熟练掌握反射API是至关重要的。

    Java 自省类教程

    - **安全限制**:默认情况下,自省无法访问私有成员,除非使用`setAccessible(true)`来禁用Java访问控制检查。 - **兼容性**:由于自省涉及到类的内部细节,因此在不同版本的JVM上可能会有不同的表现。 #### 五、...

    Java自省类教程

    Java自省类教程 在Java编程中,"自省"(Reflection)是一种强大的特性,它允许程序在运行时检查和操作类、接口、字段以及方法的信息。Java反射机制是Java平台核心API的一部分,通过它我们可以获取类的内部信息,...

    Java自省类教程.pdf

    Java自省类教程.pdf

    Java核心技术卷一第10版PDF

    第十四章会讨论Java的反射机制和注解,它们是Java动态特性的体现,能够增强代码的灵活性和自省能力。 最后,附录通常会提供一些实用的信息,比如字符集、Unicode、Java版本历史等。 总的来说,《Java核心技术卷一...

    清华大学JAVA编程语言

    讲解JAVA反射机制,如何在运行时动态获取类的信息和调用方法,以及注解的使用,理解其在代码自省和元编程中的应用。 第十讲:JAVA高级特性与实战 涵盖JAVA的高级特性,如枚举、泛型、Lambda表达式等,并结合实际...

    Java_API_1.6中文版

    这份文档详尽地解释了Java 1.6版本中的各种类、接口、方法和异常,帮助开发者理解和使用Java平台的核心功能。 1. **Java类库概述**:Java API 1.6包括了Java基础类库,如集合框架、I/O流、网络编程、多线程、反射、...

    JAVA REFLECTION IN ACTION

    此外,作者对反射背后理论的阐述,如代码自省、代理和类加载等,更是让读者对Java语言有了更深层次的理解和掌握。 ### 专家推荐 该书获得了包括Doug Lea教授(SUNY Oswego,著有《Java并发编程》)和John ...

    java程序设计电子教案

    Java程序设计是一门重要的计算机科学课程,主要针对想要学习如何使用Java编程语言进行软件开发的学员。本电子教案集合了丰富的教学资源,旨在帮助初学者和进阶者深入理解和掌握Java编程的核心概念与实践技巧。 一、...

    java课件 面向对象java技术教程 java例题解答

    尽管现代Web开发中Applet的使用已减少,但了解其工作原理对理解Java的历史和Web技术的发展仍有所帮助。 通过这些课件,学习者可以逐步深入到Java的各个核心领域,同时结合例题解答,加深对概念的理解和实际运用能力...

    Java中的反射

    Java中的反射功能允许运行中的程序对自身进行检查,并能直接操作程序的内部属性,即所谓的“自省”能力。这是Java区别于其他编程语言如Pascal、C或C++的一个重要特性,因为在这些语言中无法直接获取函数定义等信息。...

    Java中的CLASS类Java中的CLASS类

    System.out.println(c2.getName()); Class c3 = Point.class; System.out.println(c3.getName());...了解并熟练掌握Class类及其相关方法,对于理解和使用Java的高级特性,如动态代理、反射API等至关重要。

    疯狂Java_突破程序员基本功的16课.pdf

    这两部分内容将帮助读者理解Java的高级特性和自省能力。 12. **JVM与内存管理**:了解Java虚拟机的工作原理和内存模型对于优化代码性能至关重要。书中会讲解堆、栈、方法区等区域的分配与回收。 13. **Java标准库...

    一个Java程序员应该掌握的10项技能

    在成为一名出色的Java程序员的道路上,掌握一定的技能是至关重要的。以下就是10项一个Java程序员应必备的技能: 1. **语法**:对Java语法的熟练掌握是基础,...记住,见贤思齐,见不贤而内自省,不断自我完善和进步。

    Java Reflection in Action

    除了表面的操作,本书还深入探讨了代码进行自省(introspection)、代理(proxy)、类加载(class loading)等底层机制的原理。这为读者提供了更深层次的理解,帮助他们更好地掌握反射的核心思想,并在日常的Java编程中...

    java常用扩展工具jar包详解

    `commons-beanutils.jar`库简化了JavaBean的使用,提供了对Java反射和自省API的封装,主要功能有: - 对JavaBean的属性进行便捷的读写操作,无需手动编写getter和setter方法调用。 - 能够将数据结构(如Map)转换为...

    100道常用必备java面试题-java基础

    垃圾回收是 Java 自动内存管理的一部分,负责识别不再使用的对象并释放它们占用的内存空间。Java 的垃圾回收器会定期检查哪些对象不再有引用指向,从而确定哪些对象可以被回收。12. Java 中的 volatile 关键字的...

    Java反射机制

    `java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口配合使用,可以创建这样的代理类。 9. **安全性与性能**:虽然反射强大,但也需要注意其潜在的风险。不当使用可能导致安全漏洞,因为反射...

    java反射&权限控制.pdf

    在Java中,反射机制允许开发者在程序运行时动态地加载和使用未知的类,这大大增加了程序的灵活性。例如,我们可以仅凭类的名称在运行时加载类,并获取其属性、方法、构造器等信息,甚至可以动态调用对象的方法或设置...

Global site tag (gtag.js) - Google Analytics