- 浏览: 167934 次
- 来自: ...
文章分类
最新评论
-
hellostory:
不知所云………………
如何使用反射访问类的private域和方法 -
xusong_zidingyi:
如果在linux下面的话就没有办法运行了,因为linux没有办 ...
使用tesseract破解checkCode -
javajava22:
Errors accessing files. There m ...
使用tesseract破解checkCode -
suncathay:
qljobs 写道cmd.add("E:/Works ...
使用tesseract破解checkCode -
zuoxu128:
TIFFImageWriteParam ,这个类是哪个包的啊
使用tesseract破解checkCode
反射比内省更容易理解一点。用一句比较白的话来概括,反射就是让你可以通过名称来得到对象 ( 类,属性,方法 ) 的技术,这种技术比内省机制使用范围更广泛。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。
内省是
Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName
来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的
getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(
PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter
方法,然后我们就可以通过反射机制来调用这些方法。
以下是BeanInfo的源代码,其中getMethodDescriptors,getPropertyDescriptors,getEventSetDescriptors分别用来取得素有的方法,变量,事件。
/* * @(#)BeanInfo.java 1.28 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.beans; /** * A bean implementor who wishes to provide explicit information about * their bean may provide a BeanInfo class that implements this BeanInfo * interface and provides explicit information about the methods, * properties, events, etc, of their bean. * <p> * A bean implementor doesn't need to provide a complete set of * explicit information. You can pick and choose which information * you want to provide and the rest will be obtained by automatic * analysis using low-level reflection of the bean classes' methods * and applying standard design patterns. * <p> * You get the opportunity to provide lots and lots of different * information as part of the various XyZDescriptor classes. But * don't panic, you only really need to provide the minimal core * information required by the various constructors. * <P> * See also the SimpleBeanInfo class which provides a convenient * "noop" base class for BeanInfo classes, which you can override * for those specific places where you want to return explicit info. * <P> * To learn about all the behaviour of a bean see the Introspector class. */ public interface BeanInfo { /** * Gets the beans <code>BeanDescriptor</code>. * * @return A BeanDescriptor providing overall information about * the bean, such as its displayName, its customizer, etc. May * return null if the information should be obtained by automatic * analysis. */ BeanDescriptor getBeanDescriptor(); /** * Gets the beans <code>EventSetDescriptor</code>s. * * @return An array of EventSetDescriptors describing the kinds of * events fired by this bean. May return null if the information * should be obtained by automatic analysis. */ EventSetDescriptor[] getEventSetDescriptors(); /** * A bean may have a "default" event that is the event that will * mostly commonly be used by humans when using the bean. * @return Index of default event in the EventSetDescriptor array * returned by getEventSetDescriptors. * <P> Returns -1 if there is no default event. */ int getDefaultEventIndex(); /** * Gets the beans <code>PropertyDescriptor</code>s. * * @return An array of PropertyDescriptors describing the editable * properties supported by this bean. May return null if the * information should be obtained by automatic analysis. * <p> * If a property is indexed, then its entry in the result array will * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. * A client of getPropertyDescriptors can use "instanceof" to check * if a given PropertyDescriptor is an IndexedPropertyDescriptor. */ PropertyDescriptor[] getPropertyDescriptors(); /** * A bean may have a "default" property that is the property that will * mostly commonly be initially chosen for update by human's who are * customizing the bean. * @return Index of default property in the PropertyDescriptor array * returned by getPropertyDescriptors. * <P> Returns -1 if there is no default property. */ int getDefaultPropertyIndex(); /** * Gets the beans <code>MethodDescriptor</code>s. * * @return An array of MethodDescriptors describing the externally * visible methods supported by this bean. May return null if * the information should be obtained by automatic analysis. */ MethodDescriptor[] getMethodDescriptors(); /** * This method allows a BeanInfo object to return an arbitrary collection * of other BeanInfo objects that provide additional information on the * current bean. * <P> * If there are conflicts or overlaps between the information provided * by different BeanInfo objects, then the current BeanInfo takes precedence * over the getAdditionalBeanInfo objects, and later elements in the array * take precedence over earlier ones. * * @return an array of BeanInfo objects. May return null. */ BeanInfo[] getAdditionalBeanInfo(); /** * This method returns an image object that can be used to * represent the bean in toolboxes, toolbars, etc. Icon images * will typically be GIFs, but may in future include other formats. * <p> * Beans aren't required to provide icons and may return null from * this method. * <p> * There are four possible flavors of icons (16x16 color, * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only * support a single icon we recommend supporting 16x16 color. * <p> * We recommend that icons have a "transparent" background * so they can be rendered onto an existing background. * * @param iconKind The kind of icon requested. This should be * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, * ICON_MONO_16x16, or ICON_MONO_32x32. * @return An image object representing the requested icon. May * return null if no suitable icon is available. */ java.awt.Image getIcon(int iconKind); /** * Constant to indicate a 16 x 16 color icon. */ final static int ICON_COLOR_16x16 = 1; /** * Constant to indicate a 32 x 32 color icon. */ final static int ICON_COLOR_32x32 = 2; /** * Constant to indicate a 16 x 16 monochrome icon. */ final static int ICON_MONO_16x16 = 3; /** * Constant to indicate a 32 x 32 monochrome icon. */ final static int ICON_MONO_32x32 = 4; }
一般来说,我们还可以使用Map和内省机制来构造一个Bean的实例对象,实例代码如下:
import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.util.HashMap; import java.util.Map; import java.lang.reflect.InvocationTargetException; public class MapToBean { public static void main(String[] args) throws Exception { Map<Object, Object> map = new HashMap<Object, Object>(); map.put("name", "张三"); map.put("age", 30); Person p = convertMap(Person.class, map); System.out.println(p.getName() + "," + p.getAge()); } /** *将一个Map对象转化为一个JavaBean * *@param type要转化的类型 *@param map 包含属性值的map * @return转化出来的JavaBean对象 * @throwsIntrospectionException 如果分析类属性失败 *@throwsIllegalAccessException 如果实例化JavaBean失败 *@throwsInstantiationException 如果实例化JavaBean失败 *@throwsInvocationTargetException如果调用属性的setter方法失败 */ private static<T> T convertMap(Class<T> type, Map<Object, Object> map) throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException { BeanInfo beanInfo = Introspector.getBeanInfo(type);// 获取类属性 T t = type.newInstance();// 创建JavaBean对象 // 给JavaBean对象的属性赋值 for (PropertyDescriptor descriptor : beanInfo.getPropertyDescriptors()) { String propertyName = descriptor.getName(); if (map.containsKey(propertyName)) { // 下面一句可以try起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。 descriptor.getWriteMethod().invoke(t, map.get(propertyName)); } } return t; } } class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
参考地址:http://yangzhibin-java.iteye.com/blog/452068
发表评论
-
一些随想
2012-06-01 22:05 0需求 idea 方案 执 ... -
Redis的安装与使用
2011-10-24 20:04 1292今天看了下redis相关的东东,做个备忘。 Re ... -
Redis的安装与使用
2011-10-24 20:00 0Redis 服务端: http://cocos.iteye. ... -
GenericDAO
2011-07-31 14:49 0GenericDAO -
loadfromproperties
2011-07-31 14:48 0loadfromproperties -
resultcode
2011-07-31 14:47 0resultcode -
berkeleydb的使用
2011-10-24 20:05 1883在napoli的代码中发现这个berkeleydb,版本为3. ... -
几种简单的Load Balance方法
2011-07-31 13:44 0以下代码出自napoli (1)定义Selec ... -
参数断言工具
2011-07-31 12:58 952见代码: public final class Argume ... -
如何检测线上代码的运行情况---BTrace使用分享
2011-04-10 17:36 2087(1)你是否有时发现线上的代码运行效率不高,但却无法定位到底具 ... -
napoli和JMS,mq的一些知识
2010-11-26 21:01 01 jms和mq (1)jms activeMQ 应用 h ... -
Taglib基础知识
2010-11-26 12:41 0浅论taglib设计 : http://wenku.bai ... -
java编码问题的一些文章
2010-11-11 17:30 0http://www.iteye.com/topic/8047 ... -
URL在转码的过程中数据丢失
2010-10-25 14:52 0示例代码 import java.io.Unsuppo ... -
遍历大容量map的正确方法
2010-10-08 13:20 11192首先,遍历map有以下方法: import java.uti ... -
B2B-Code Review规范
2010-08-31 10:15 01.目标 凡事知其然还要知其所以然,我们首先需要知道什么 ... -
多线程书写及code review规范
2010-08-31 10:09 14501. 不允许将Calendar用于类的静态成员 ... -
域名白名单检查
2010-08-24 21:05 0首先准备一份白名单名为safe-domain.xml ,如下: ... -
如何使用反射访问类的private域和方法
2010-08-17 21:44 5132如何使用反射访问类的private域和方法?非常简单,由 ... -
FindBugs插件的安装与使用
2010-04-21 10:54 19141 什么是FindBugs FindBugs 是一个静态分析 ...
相关推荐
"JAVA的内省机制(introspector)与反射机制(reflection)" JAVA 的内省机制(introspector)和反射机制(reflection)是两个重要的概念,在 JAVA 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们...
`Introspector` 是Java内省的核心类,它提供了一系列的方法来获取关于JavaBean的信息。例如,`Introspector.getBeanInfo(Class)` 方法可以获取指定类的BeanInfo,这包含了关于类的属性(PropertyDescriptor)、事件...
Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...
内省(Introspection)则是Java提供的一种用于获取和修改对象属性的能力,主要通过java.beans包中的Introspector和PropertyDescriptor类实现。它主要用于处理JavaBeans规范的对象,可以获取Bean的属性、事件和方法...
通过使用 `java.beans.Introspector` 类,可以在运行时发现 JavaBean 的属性并进行操作。 在 J2EE 应用中,内省机制常用于框架自动识别 JavaBean 的属性,并根据这些属性进行相应的操作,例如:在容器中自动注入...
在Struts2中,Introspector是一个核心组件,用于检查和获取Action类的属性,这对于实现诸如日志记录、数据验证等任务非常有用。这篇博客文章可能探讨了如何利用Struts2的Introspector来实现日志功能。 日志在软件...
### Java中的内省与反射详解 #### 一、引言 在深入了解Java语言的过程中,我们会遇到两个重要的概念:反射和内省。这两种技术在实际开发中有着广泛的应用,尤其是在需要进行动态操作或元数据处理的场景下尤为重要...
资源分类:Python库 所属语言:Python 资源全名:plone.introspector-0.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.zip) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...
Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.tar.gz) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...
轻巧,快速的java.beans.Introspector重新实现,用于消除对Bean Introspection的java.desktop模块的依赖。 问题 JDK 9中引入的模块封装了Java标准库中的所有AWT,Swing,Image和Sound软件包。 除此之外,它还包含带...
这个包是一个薄包装器,它从内省中检索建议: 安装 使用 Atom 包管理器,它可以在设置视图中找到,或者从命令行运行apm install php-introspector 。 您还需要安装软件包。 用法 目前,自动完成依赖于从远程(或...
在Spring框架的学习中,我们经常会接触到各种组件和机制,其中之一就是`IntrospectorCleanupListener`。这个类在Spring源码中扮演着一个重要的角色,主要目的是解决与`Introspector`相关的内存泄漏问题。首先,我们...
骨干内省者骨干应用程序自省-生成应用程序组件的树状图(使用d3.js)要求骨干应用装有require.js的模块预习 还检查TodirMVC实现的示例目录安装在您的main.js中require ( ['backbone' ,'views/app' ,'routers/router'...
- 内省:使用Introspector类进行对象属性的获取和设置。 - 注解:理解注解的作用,以及如何自定义注解并配合反射使用。 - 泛型:理解泛型的基本概念,提高代码的类型安全性。 - 代理:学习动态代理和静态代理,...
Eclipse 平台的 COM 内省器和代码生成器
Introspector使处理源代码的编程工具(例如编译器)能够以标准且中立的方式进行通信,从而减少了意外的编程成本。 http://github.com/h4ck3rm1k3/
本文将重点讨论在Java反射中使用java.beans包学习的主要知识点: 1. **PropertyEditor**: `PropertyEditor`接口是JavaBeans的核心组件之一,用于处理JavaBean的属性转换。它允许我们将字符串与其他类型的数据之间...
例如,通过Introspector、BeanInfo和PropertyDescriptor等类,可以方便地获取和设置JavaBean的属性值。 BeanUtils是Apache Commons BeanUtils库的一部分,它提供了一种简单的方式来操作JavaBean的属性,如`...
讲一些经典的:静态导入 自动装箱/拆箱 增强for循环 可变参数 内省(Introspector) — JavaBean ......