知识大全 java内省机制
Posted 属性
篇首语:能够说服别人最好的方式,其实就是你始终坚持在做的事。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java内省机制相关的知识,希望对你有一定的参考价值。
内省是 Java 语言对 Bean 类属性 事件的一种处理方法(也就是说给定一个javabean对象 我们就可以得到/调用它的所有的get/set方法)
例如类 A 中有属性 name 那我们可以通过 getName setName 来得到其值或者设置新的值 通过 getName/setName 来访问 name 属性 这就是默认的规则
Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法 通过这些 API 可以使你不需要了解这个规则 这些 API 存放于包 java beans 中
一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息 然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor) 通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法 然后我们就可以通过反射机制来调用这些方法
内省测试类:Introspector java
Java代码
package royzhou bean;
import java beans BeanInfo; import java beans Introspector; import java beans MethodDescriptor; import java beans PropertyDescriptor;
public class IntrospectorTest
public static void main(String[] args) throws Exception
SimpleBean sb = new SimpleBean( royzhou new String[] football backetball );
System out println(sb);
/**
* 使用Introspector getBeanInfo(SimpleBean class)将Bean的属性放入到BeanInfo中
* 第二个参数为截止参数 表示截止到此类之前 不包括此类
* 如果不设置的话 那么将会得到本类以及其所有父类的info
* BeanInfo中包含了SimpleBean的信息
*/
BeanInfo beanInfo = Introspector getBeanInfo(sb getClass());
//将每个属性的信息封装到一个PropertyDescriptor形成一个数组其中包括属性名字 读写方法 属性的类型等等PropertyDescriptor[] propertys = beanInfo getPropertyDescriptors();
for(PropertyDescriptor property : propertys)
System out println( 属性名: + property getName()); System out println( 类型: + property getPropertyType());
System out println();
System out println( 列出SimpleBean的所有方法 ); MethodDescriptor[] methods = beanInfo getMethodDescriptors();
for(MethodDescriptor method : methods)
System out println(method getName());
System out println();
/**
*重新设置属性值
*/
for(PropertyDescriptor property : propertys)
if(property getPropertyType() isArray()) //getPropertyType得到属性类型
if(property getPropertyType() isArray()) if( hobby equals(property getName()))
//getComponentType()可以得到数组类型的元素类型
if(property getPropertyType() getComponentType() equals(String class))
//getWriteMethod()得到此属性的set方法 Method对象 然后用invoke调用这个方法
property getWriteMethod() invoke(sb new Object[]new String[] tennis fishing );
else if( name equals(property getName())) property getWriteMethod() invoke(sb new Object[] royzhou );
/**
*获取对象的属性值
*/
System out println( 获取对象的属性值 );
for(PropertyDescriptor property : propertys)
if(property getPropertyType() isArray()) //getPropertyType得到属性类型
//getReadMethod()得到此属性的get方法 Method对象 然后用invoke调用这个方法String[] result=(String[]) property getReadMethod() invoke(sb new Object[]); System out print(property getName()+ : );//getName得到属性名字for (int j = ; j < result length; j++) System out print(result[j] + );
System out println();
else
System out println(property getName()+ : +property getReadMethod() invoke(sb new Object[]));
package royzhou bean;
import java beans BeanInfo; import java beans Introspector; import java beans MethodDescriptor; import java beans PropertyDescriptor;
public class IntrospectorTest
public static void main(String[] args) throws Exception
SimpleBean sb = new SimpleBean( royzhou new String[] football backetball );
System out println(sb);
/**
* 使用Introspector getBeanInfo(SimpleBean class)将Bean的属性放入到BeanInfo中
* 第二个参数为截止参数 表示截止到此类之前 不包括此类
* 如果不设置的话 那么将会得到本类以及其所有父类的info
* BeanInfo中包含了SimpleBean的信息
*/
BeanInfo beanInfo = Introspector getBeanInfo(sb getClass());
//将每个属性的信息封装到一个PropertyDescriptor形成一个数组其中包括属性名字 读写方法 属性的类型等等PropertyDescriptor[] propertys = beanInfo getPropertyDescriptors();
for(PropertyDescriptor property : propertys)
System out println( 属性名: + property getName()); System out println( 类型: + property getPropertyType());
System out println();
System out println( 列出SimpleBean的所有方法 ); MethodDescriptor[] methods = beanInfo getMethodDescriptors();
for(MethodDescriptor method : methods)
System out println(method getName());
System out println();
/**
*重新设置属性值
*/
for(PropertyDescriptor property : propertys)
if(property getPropertyType() isArray()) //getPropertyType得到属性类型
if(property getPropertyType() isArray()) if( hobby equals(property getName()))
//getComponentType()可以得到数组类型的元素类型
if(property getPropertyType() getComponentType() equals(String class)) //getWriteMethod()得到此属性的set方法 Method对象 然后用invoke调用这个方法property getWriteMethod() invoke(sb new Object[]new String[] tennis fishing );
else if( name equals(property getName())) property getWriteMethod() invoke(sb new Object[] royzhou );
/**
*获取对象的属性值
*/
System out println( 获取对象的属性值 );
for(PropertyDescriptor property : propertys)
if(property getPropertyType() isArray()) //getPropertyType得到属性类型
//getReadMethod()得到此属性的get方法 Method对象 然后用invoke调用这个方法String[] result=(String[]) property getReadMethod() invoke(sb new Object[]); System out print(property getName()+ : );//getName得到属性名字for (int j = ; j < result length; j++) System out print(result[j] + );
System out println();
else
System out println(property getName()+ : +property getReadMethod() invoke(sb new Object[]));
输出结果:
royzhou bean SimpleBean@ aef
name:=royzhou
hobby:football backetball
属性名:class
类型:class java lang Class
属性名:hobby
类型:class [Ljava lang String;
属性名:name
类型:class java lang String
列出SimpleBean的所有方法
hashCode
setHobby
equals
wait
wait
notify
getClass
toString
notifyAll
getHobby
setName
wait
getName
获取对象的属性值
class:class royzhou bean SimpleBean hobby:tennis fishing
cha138/Article/program/Java/hx/201311/26908相关参考
Java核心Java中多态的实现机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 多态性是面向
Java绘图机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JAVA的绘图功能非常丰富绘图包
Java反射机制深入研究 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java反射是Java语
Java垃圾回收机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java垃圾回收主要是靠一个
JAVA的Socket机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Socket机制用到的
Java多线程处理机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一线程的同步 Java应
Java移位运算机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 举例代码 publiccl
Java的文件IO机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java有一个庞大的I/O
实现JAVA的动态类载入机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 作为充分利用Java
Java堆栈溢出的机制与原理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java堆栈溢出的出