转自:http://blog.sina.com.cn/s/blog_52fea7b60100wks4.html
1. Class Diagram
2. 实例
package com.siyuan.jdktest;
import java.beans.BeanDescriptor;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
class Person {
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class IntrospectorTest {
public static void main(String[] args) throws IntrospectionException {
// TODO Auto-generated method stub
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
System.out.println("BeanDescriptor===========================================");
BeanDescriptor beanDesc = beanInfo.getBeanDescriptor();
Class cls = beanDesc.getBeanClass();
System.out.println(cls.getName());
System.out.println("MethodDescriptor===========================================");
MethodDescriptor[] methodDescs = beanInfo.getMethodDescriptors();
for (int i = 0; i < methodDescs.length; i++) {
Method method = methodDescs[i].getMethod();
System.out.println(method.getName());
}
System.out.println("PropertyDescriptor===========================================");
PropertyDescriptor[] propDescs = beanInfo.getPropertyDescriptors();
for (int i = 0; i < propDescs.length; i++) {
Method methodR = propDescs[i].getReadMethod();
if (methodR != null) {
System.out.println(methodR.getName());
}
Method methodW = propDescs[i].getWriteMethod();
if (methodW != null) {
System.out.println(methodW.getName());
}
}
}
}
3. 运行结果
BeanDescriptor===========================================
com.siyuan.jdktest.Person
MethodDescriptor===========================================
hashCode
setAge
equals
wait
wait
notify
getClass
toString
getAge
notifyAll
setName
wait
getName
PropertyDescriptor===========================================
getAge
setAge
getClass
getName
setName
二》:JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
1. 得到某个对象的属性
- public Object getProperty(Object owner, String fieldName) throws Exception {
- Class ownerClass = owner.getClass();
-
- Field field = ownerClass.getField(fieldName);
-
- Object property = field.get(owner);
-
-
return property;
- }
Class ownerClass = owner.getClass():得到该对象的Class。
Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。
Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
2. 得到某个类的静态属性
- public Object getStaticProperty(String className, String fieldName)
-
throws Exception {
- Class ownerClass = Class.forName(className);
-
- Field field = ownerClass.getField(fieldName);
-
- Object property = field.get(ownerClass);
-
-
return property;
- }
Class ownerClass = Class.forName(className) :首先得到这个类的Class。
Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。
Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。
3. 执行某对象的方法
- public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
-
- Class ownerClass = owner.getClass();
-
-
Class[] argsClass = new Class[args.length];
-
-
for (int i = 0, j = args.length; i < j; i++) {
- argsClass[i] = args[i].getClass();
- }
-
- Method method = ownerClass.getMethod(methodName,argsClass);
-
-
return method.invoke(owner, args);
- }
Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。
5~9行:配置参数的Class数组,作为寻找Method的条件。
Method method = ownerClass.getMethod(methodName, argsClass):通过methodName和参数的argsClass(方法中的参数类型集合)数组得到要执行的Method。
method.invoke(owner, args):执行该Method.invoke方法的参数是执行这个方法的对象owner,和参数数组args,可以这么理解:owner对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值。
4. 执行某个类的静态方法
- public Object invokeStaticMethod(String className, String methodName,
-
Object[] args) throws Exception {
- Class ownerClass = Class.forName(className);
-
-
Class[] argsClass = new Class[args.length];
-
-
for (int i = 0, j = args.length; i < j; i++) {
- argsClass[i] = args[i].getClass();
- }
-
- Method method = ownerClass.getMethod(methodName,argsClass);
-
-
return method.invoke(null, args);
- }
基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。
5. 新建实例
- public Object newInstance(String className, Object[] args) throws Exception {
- Class newoneClass = Class.forName(className);
-
-
Class[] argsClass = new Class[args.length];
-
-
for (int i = 0, j = args.length; i < j; i++) {
- argsClass[i] = args[i].getClass();
- }
-
- Constructor cons = newoneClass.getConstructor(argsClass);
-
-
return cons.newInstance(args);
-
- }
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。
Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。
第5~第9行:得到参数的Class数组。
Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。
cons.newInstance(args):新建实例。
6. 判断是否为某个类的实例
- public boolean isInstance(Object obj, Class cls) {
-
return cls.isInstance(obj);
- }
7. 得到数组中的某个元素
Java代码
- public Object getByArray(Object array, int index) {
- return Array.get(array,index);
- }
分享到:
相关推荐
"JAVA的内省机制(introspector)与反射机制(reflection)" JAVA 的内省机制(introspector)和反射机制(reflection)是两个重要的概念,在 JAVA 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们...
### Java中的内省与反射详解 #### 一、引言 在深入了解Java语言的过程中,我们会遇到两个重要的概念:反射和内省。这两种技术在实际开发中有着广泛的应用,尤其是在需要进行动态操作或元数据处理的场景下尤为重要...
Java 内省(Introspection)是Java提供的一种机制,允许程序在运行时检查对象的属性和方法。...然而,内省也有一些缺点,如性能开销较大,因为每次调用都需要反射操作,所以在对性能要求较高的场景下需谨慎使用。
内省(Introspection)则是Java提供的一种用于获取和修改对象属性的能力,主要通过java.beans包中的Introspector和PropertyDescriptor类实现。它主要用于处理JavaBeans规范的对象,可以获取Bean的属性、事件和方法...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。JavaBeans包(java.beans)提供了与JavaBeans组件交互的相关类和接口,这些组件是Java面向对象...
内省在实际开发中有着广泛的应用,例如在框架中进行数据绑定、属性的动态修改、序列化和反序列化,以及XML与Java对象之间的映射等。了解并熟练掌握Java内省机制,可以提高代码的灵活性和可维护性,尤其是在处理基于...
`Introspector`是Java标准库`java.beans`包下的一个类,它的主要功能是对JavaBean进行反射式的元数据获取。通过`Introspector.getBeanInfo()`方法,我们可以得到一个`BeanInfo`对象,其中包含了类的属性、方法和事件...
例如,通过Introspector、BeanInfo和PropertyDescriptor等类,可以方便地获取和设置JavaBean的属性值。 BeanUtils是Apache Commons BeanUtils库的一部分,它提供了一种简单的方式来操作JavaBean的属性,如`...
反射机制在 Java 中的应用 - 批量修改 Java 类某一属性 在 Java 中,反射机制是一种非常重要的技术,它可以在运行时动态地获取和修改类的信息。在本文中,我们将详细介绍如何利用反射机制批量修改 Java 类某一属性...
5. **反射API的使用**:如`java.beans.Introspector`用于JavaBeans属性的访问。 然而,反射也有一些潜在的问题需要注意: 1. **性能损失**:反射操作比直接调用方法或访问字段慢,因为它涉及到安全检查和运行时...
2. **Introspector**:Java提供了一个名为`Introspector`的工具类,它能自动查找JavaBean的属性、方法和事件,便于操作JavaBean。 3. **JSP和Servlet中的JavaBean**:在Web开发中,JavaBean常被用作JSP页面和...
- **反射机制**:该工具类大量使用了Java反射API(如`Introspector.getBeanInfo()`、`PropertyDescriptor`等)来获取和设置JavaBean的属性。 - **泛型**:使用了泛型`<T>`,使得该工具类可以应用于任意类型的...
数组与Object的关系及其反射类型 - 在Java中,数组也是一种对象,可以通过反射创建和操作数组。 ##### 9. 数组的反射应用 - 可以使用反射来创建不同类型的数组,并通过反射调用方法来操作这些数组。 #### 六、...
- 使用工具如Introspector可以获取JavaBean的属性信息,从而实现对JavaBean的动态操作。 通过以上知识点的总结,可以看出Java Web开发中所涉及的广泛内容,包括开发工具的使用技巧、程序调试和测试方法、Java语言...
`Introspector.getBeanInfo()`方法用于获取目标对象类的BeanInfo,该BeanInfo包含了类的所有属性的描述信息,即PropertyDescriptor数组。通过遍历这些PropertyDescriptor,可以找到对应的setter方法(writeMethod)...
5. **设计模式**:JavaBeans遵循“封装、继承和多态”的面向对象设计原则,常与Singleton、Factory等设计模式结合使用。 6. **可视化组件**:在Java Swing或JavaFX中,JavaBeans可以作为用户界面元素,通过可视化...
在这些方法中,作者利用了org.json库中的JSONObject类,以及Java反射API中的Introspector和PropertyDescriptor类,来实现属性的提取和转换。 通过阅读本文,我们可以了解到,虽然有时可以通过反射机制不需要编写...
5. **Introspector**: 这个模块提供了对JavaBean的元数据(如属性、构造函数和方法)的深入洞察。通过`describe()`方法,开发者可以获取Bean的完整描述,包括其所有属性、方法和构造函数的信息。 6. **LocaleUtils*...
Introspector 库提供了 BeanInfo 对象,可以将 Object 对象转换为 Map 对象。 ```java public Map, Object> obj2Map(Object obj) throws Exception { Map, Object> map = new HashMap, Object>(); BeanInfo ...
Introspector用于处理对象的反射访问。 ##### 2.12 日志配置 - **runtime.log**:指定Velocity运行时日志文件的路径和文件名。如果未提供绝对路径,则相对于当前工作目录。 - **runtime.log.logsystem**:该参数...