Class object获取方法 | 示例 |
---|---|
运用getClass() 注:每个 Object 的对象都有此函数 |
String str = "abc"; Class c1 = str.getClass(); |
运用static method Class.forName() (最常被使用) |
Class c1 = Class.forName ("java.lang.String"); Class c3 = Class.forName ("java.util.LinkedList$Entry"); Class c4 = Class.forName ("I"); Class c5 = Class.forName ("[I"); |
运用 .class 语法 |
Class c1 = String.class; Class c3 = Main.InnerClass.class; Class c4 = int.class; Class c5 = int[].class; |
运用
Class.getSuperclass() 注:如果操作对象是Object,Class.getSuperClass()会返回null |
Button b = new Button(); Class c1 = b.getClass(); Class c2 = c1.getSuperclass(); |
运用 |
Class c3 = Character.TYPE; Class c5 = Integer.TYPE; Class c6 = Long.TYPE; Class c8 = Double.TYPE; Class c9 = Void.TYPE; |
class ReflectionDemo
{
public static void main(String[] args) throws Exception
{
Class clazz = ReflectionDemo.class;
Class clazz1 = Class.forName("ReflectionDemo");
Class clazz2 = clazz.getClass();
System.out.println("Hello World!");
}
}
package cn.itcast.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
/**
* @class: ReflectionClassDemo
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-20 上午10:55:13
* @version: 1.0
*/
public class ReflectionClassDemo {
public static void main(String args[]) throws Exception {
ReflectionClassDemo ref = new ReflectionClassDemo();
ref.getConstructor();
}
public void getConstructor() throws Exception {
Class> c = Class.forName("java.lang.Long");
Class> cs[] = { java.lang.String.class };
System.out.println("\n-------------------------------\n");
Constructor> cst1 = c.getConstructor(cs);
System.out.println("1、通过参数获取指定Class对象的构造方法:");
System.out.println(cst1.toString());
Constructor cst2 = c.getDeclaredConstructor(cs);
System.out.println("2、通过参数获取指定Class对象所表示的类或接口的构造方法:");
System.out.println(cst2.toString());
Constructor cst3 = c.getEnclosingConstructor();
System.out.println("3、获取本地或匿名类Constructor 对象,它表示基础类的立即封闭构造方法。");
if (cst3 != null)
System.out.println(cst3.toString());
else
System.out.println("-- 没有获取到任何构造方法!");
Constructor[] csts = c.getConstructors();
System.out.println("4、获取指定Class对象的所有构造方法:");
for (int i = 0; i < csts.length; i++) {
System.out.println(csts[i].toString());
}
System.out.println("\n-------------------------------\n");
Type types1[] = c.getGenericInterfaces();
System.out.println("1、返回直接实现的接口:");
for (int i = 0; i < types1.length; i++) {
System.out.println(types1[i].toString());
}
Type type1 = c.getGenericSuperclass();
System.out.println("2、返回直接超类:");
System.out.println(type1.toString());
Class[] cis = c.getClasses();
System.out.println("3、返回 Class 中使用的所有的类和所有的接口:");
for (int i = 0; i < cis.length; i++) {
System.out.println(cis[i].toString());
}
Class cs1[] = c.getInterfaces();
System.out.println("4、实现的接口");
for (int i = 0; i < cs1.length; i++) {
System.out.println(cs1[i].toString());
}
System.out.println("\n-------------------------------\n");
Field fs1[] = c.getFields();
System.out.println("1、类或接口的所有可访问公共字段:");
for (int i = 0; i < fs1.length; i++) {
System.out.println(fs1[i].toString());
}
Field f1 = c.getField("MIN_VALUE");
System.out.println("2、类或接口的指定已声明指定公共成员字段:");
System.out.println(f1.toString());
Field fs2[] = c.getDeclaredFields();
System.out.println("3、类或接口所声明的所有字段:");
for (int i = 0; i < fs2.length; i++) {
System.out.println(fs2[i].toString());
}
Field f2 = c.getDeclaredField("serialVersionUID");
System.out.println("4、类或接口的指定已声明指定字段:");
System.out.println(f2.toString());
System.out.println("\n-------------------------------\n");
Method m1[] = c.getMethods();
System.out.println("1、返回类所有的公共成员方法:");
System.out.println(m1.length);
for (int i = 0; i < m1.length; i++) {
System.out.println(m1[i].toString());
}
Method m3[] = c.getDeclaredMethods();
System.out.println("2、返回类自己定义所有的成员方法:");
System.out.println(m3.length);
for (int i = 0; i < m3.length; i++) {
System.out.println(m3[i].toString());
}
Method m2 = c.getMethod("longValue", new Class[] {});
System.out.println("3、返回指定公共成员方法:");
System.out.println(m2.toString());
}
}
更多 Class 类和 Class 对象的功能函数请参考 JDK API 手册。
//用字节码获取获取 String 的带 StringBuffer 参数的构造方法.返回 Constructor 类型对象
Constructor constructor = String.class.getConstructor(Class.forName("StringBuffer"));
//再用 Constructor 类中的 newInstance 方法给构造方法实例化.
String str2=(String)constructor1.newInstance(new StringBuffer("abc"));
//打印返回的字符串角标位置上的字符
System.out.println(str2.charAt(2));
//成员变量的反射
ReflectPoint pt1 = new ReflectPoint(3, 6);
//成员变量时共有的可以正常反射
Field filedY = pt1.getClass().getField("y");
System.out.println(filedY.get(pt1));
//如果成员变量是私有的要强行反射getDeclaredField
Field fieldX = pt1.getClass().getDeclaredField("x");
//暴力反射修改字段的访问属性的方法方法 setAccessible(true); 这是继承自 java.lang.reflect.AccessibleObject 的方法
fieldX.setAccessible(true);
//获取
System.out.println(fieldX.get(pt1));
/**
* 需求:演示反射 API 中 Feild 类的用法
*
* 思路: 使用反射替换某个对象中字符字段的值
*
* 步骤:
*
* 总结:
* Class 对象中的 getFeilds 可以获取该 Class 所有public字段
* Feild 对象中的 get 方法可以获取某个对象的该字段的值
* Feild 对象中的 set 方法可以设置某个对象的该字段的值
* Feild 对象中的 setAccessable 方法可以这种某个对象的该字段的访问属性
*/
package cn.itcast.reflect;
import java.lang.reflect.Field;
/**
* @class: FieldReflectionDemo
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-20 下午11:34:20
* @version: 1.0
*/
public class FieldReflectionDemo {
public String string1 = "ball";
public String string2 = "basketball";
public String string3 = "itcast";
/**
* @method: main
* @description: TODO
* @param args
* @return: void
* @author: vivianZhao
* @date: 2013-7-20 下午11:34:20
* @version: 1.0
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws ClassNotFoundException,
IllegalArgumentException, IllegalAccessException {
// TODO Auto-generated method stub
String value;
FieldReflectionDemo fieldReflectionDemo = new FieldReflectionDemo();
Class> clazz = Class.forName("cn.itcast.reflect.FieldReflectionDemo");
Field[] feilds = clazz.getFields();
for (Field feild : feilds) {
if (feild.getType() == String.class) {
value = (String) feild.get(fieldReflectionDemo);
value = value.replace('b', 'a');
feild.set(fieldReflectionDemo, value);
}
}
System.out.println(fieldReflectionDemo);
}
@Override
public String toString() {
return "FieldReflectionDemo [string1=" + string1 + ", string2="
+ string2 + ", string3=" + string3 + "]";
}
}
//获取 String 的字节码对象调用字节码的 getmethod 方法.获取 String 的 charAt 方法.int.class是1.5之后的
//新特性.可变参数.
Method methodCharAt = String.class.getMethod("charAt", int.class);
//调用Method的invoke方法.获取Str1,的第二个角标位置
System.out.println(methodCharAt.invoke(str1, 2));
/**
* 需求:演示数组 和 Object 的关系
*
* 思路:
* 1.获取数组的 Class 对象,比较是否相等
* 2.打印数组的 Class 对象的名字
* 3.数组 和 Object 类型之间的类型转换
*
* 步骤:
*
* 总结:
* 1.java 里面,相同元素类型和相同维度数的数组是同一个类型的数组,对应同一个 Class 对象
* 2.数组类型的签名是" [ + 元素类型名签名 ",如果是多维数组,也是符合前面的规则,结果就成了几维数组会有几
* 个" [ "符号
* 3.数组类型可以向上转型为 Object 类型
* 4.java 语言中没有多维数组,其实都是一维数组,所谓多维数组,是数组中的元素还是数组,只有最后一层是一个非
* 数组类型
*/
package cn.itcast.reflect;
/**
* @class: ArrayAndObject
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-21 上午10:03:02
* @version: 1.0
*/
public class ArrayAndObject {
/**
* @method: main
* @description: TODO
* @param args
* @return: void
* @author: vivianZhao
* @date: 2013-7-21 上午10:03:02
* @version: 1.0
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] a1 = new int[4];
int [] a2 = new int[5];
int [][] a3 = new int[2][3];
String [] a4 = new String[3];
// 返回 true,说明同类型同维度的数组是同一个 Class 对象
System.out.println(a1.getClass() == a2.getClass());
// 不可比较,说明同类型不同维度的数组不是同一个 Class 对象
//System.out.println(a1.getClass() == a3.getClass());
// 不可比较,说明不同类型同维度的数组不是同一个 Class 对象
//System.out.println(a1.getClass() == a4.getClass());
// 数组类型的名称是 [ + 类型名签名,如果是多维数组,几维数组用几个 [
System.out.println(a1.getClass().getName());
System.out.println(a3.getClass().getName());
System.out.println(a4.getClass().getName());
// 数组类型的父类型都是 Object 类型
System.out.println(a1.getClass().getSuperclass().getName());
System.out.println(a3.getClass().getSuperclass().getName());
// 数组类型的父类都是 Object 类型,所以数组类型可以上转为 Object 类
Object aObject1 = a1;
Object aObject2 = a4;
// 数组中的元素有两种类型,一种是基本类型,一种是引用类型
//Object[] aObjects3 = a1;
// 数组类型的类型匹配需要匹配两个地方,第一个是否是数组,第二个数组中的元素类型的匹配
// Object [] aObject4 定义了一个 ,一维数组,其中数组中的元素是 Object 类型
// a3 是定义了一个一维数组A,数组中的元素是 一维数组B,一维数组B中的元素是 int 类型,一维数组B可以
// 向上转型为 Object 类型,所以可认为 Java 语言中没有多维数组,其实都是一维数组,所谓多维数组,是
// 数组中的元素还是数组,只有最后一层是一个非数组类型
Object[] aObject4 = a3;
Object[] aObject5 = a4;
}
}
int [] a11 = new int[]{1, 2, 3};
String [] a12 = new String[]{"a", "b","c"};
System.out.println(Arrays.asList(a11));
// 这说明数组中的元素向上转型的时候不会进行自动装箱拆箱
// 自动装箱拆箱只会在运算符表达式中进行
//System.out.println(Arrays.asList((Integer [])a11));
System.out.println(Arrays.asList(a12));
/**
*
*/
package cn.itcast.reflect;
import java.util.HashSet;
/**
* @class: HashSetModif
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-21 下午12:19:59
* @version: 1.0
*/
public class HashSetModify {
/**
* @method: main
* @description: TODO
* @param args
* @return: void
* @author: vivianZhao
* @date: 2013-7-21 下午12:19:59
* @version: 1.0
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet points = new HashSet();
Point point1 = new Point(1, 2);
Point point2 = new Point(2, 4);
Point point3 = new Point(3, 5);
points.add(point1);
points.add(point2);
points.add(point3);
System.out.println(points);
point1.x = 16;
System.out.println(points);
for (Point point : points) {
System.out.println(point);
}
System.out.println(points.contains(point1));
}
static class Point {
int x;
int y;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
@Override
public String toString() {
return "Point [x=" + x + ", y=" + y + "]";
}
}
}
/**
*
*/
package cn.itcast.reflect;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
/**
* @class: HashSetModif
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-21 下午12:19:59
* @version: 1.0
*/
public class ReflectionProperties {
/**
* @method: main
* @description: TODO
* @param args
* @return: void
* @author: vivianZhao
* @date: 2013-7-21 下午12:19:59
* @version: 1.0
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
InputStream inputStream = new FileInputStream("config.properties");
Properties properties = new Properties();
properties.load(inputStream);
inputStream.close();
String className = properties.getProperty("className");
Collection points = (Collection) Class.forName(className)
.newInstance();
Point point1 = new Point(1, 2);
Point point2 = new Point(2, 4);
Point point3 = new Point(3, 5);
Point point4 = new Point(3, 5);
points.add(point1);
points.add(point2);
points.add(point3);
points.add(point4);
System.out.println(points.size());
}
static class Point {
//同上一个例子
}
}
/**
*
*/
package cn.itcast.reflect;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
/**
* @class: HashSetModif
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-21 下午12:19:59
* @version: 1.0
*/
public class ReflectionProperties {
/**
* @method: main
* @description: TODO
* @param args
* @return: void
* @author: vivianZhao
* @date: 2013-7-21 下午12:19:59
* @version: 1.0
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// 这个是到运行时用户当前目录下去加载文件
InputStream inputStream = new FileInputStream("config.properties");
// 这个是到 classpath 文件目录中去加载文件, 这个只能是读入文件
inputStream = ReflectionProperties.class.getClassLoader()
.getResourceAsStream("cn/itcast/reflect/config.properties");
// Class 对象的 getResourceAsStream 可以使用相对路径
inputStream = ReflectionProperties.class
.getResourceAsStream("config.properties");
// Class 对象的 getResourceAsStream 可以使用其他包的相对路径
inputStream = ReflectionProperties.class
.getResourceAsStream("resource/config.properties");
// Class 对象的 getResourceAsStream 可以使用绝对路径
inputStream = ReflectionProperties.class
.getResourceAsStream("/cn/itcast/reflect/config.properties");
Properties properties = new Properties();
properties.load(inputStream);
inputStream.close();
String className = properties.getProperty("className");
}
}
/**
* 需求:自己模拟内省的操作
*/
package cn.itcast.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @class: ReflectionCopyObject
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-20 下午1:33:47
* @version: 1.0
*/
public class ReflectionCopyObject {
public Object copy(Object object) throws Exception {
// 获得对象的类型
Class> classType = object.getClass();
System.out.println("Class:" + classType.getName());
// 通过默认构造方法创建一个新的对象
Object objectCopy = classType.getConstructor(new Class[] {})
.newInstance(new Object[] {});
// 获得对象的所有属性
Field fields[] = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// 获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 获得和属性对应的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1);
// 获得和属性对应的getXXX()方法
Method getMethod = classType.getMethod(getMethodName,
new Class[] {});
// 获得和属性对应的setXXX()方法
Method setMethod = classType.getMethod(setMethodName,
new Class[] { field.getType() });
// 调用原对象的getXXX()方法
Object value = getMethod.invoke(object, new Object[] {});
System.out.println(fieldName + ":" + value);
field.setAccessible(true);
System.out.println(field.get(object).getClass());
// 调用拷贝对象的setXXX()方法
setMethod.invoke(objectCopy, new Object[] { value });
}
return objectCopy;
}
/**
* @method: main
* @description: TODO
* @param args
* @return: void
* @author: vivianZhao
* @date: 2013-7-20 下午1:33:47
* @version: 1.0
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Customer customer = new Customer("Tom", 21);
customer.setId(new Long(1));
Customer customerCopy = (Customer) new ReflectionCopyObject().copy(customer);
System.out.println("Copy information:" + customerCopy.getId() + " "
+ customerCopy.getName() + " " + customerCopy.getAge());
}
}
class Customer {
private Long id;
private String name;
private int age;
public Customer() {
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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;
}
}
一、通过属性描述符 PropertyDescriptor 来操作 Bean 对象
二、通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取所以属性的描述器( PropertyDescriptor ),通过某个属性描述器就可以获取这个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。
PropertyDescriptor
java.lang.Object
java.beans.FeatureDescriptor
java.beans.PropertyDescriptor
PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性
构造器
PropertyDescriptor(String propertyName, Class> beanClass)
通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。
常用方法
Method getReadMethod()
获得应该用于读取属性值的方法。
Method getWriteMethod()
获得应该用于写入属性值的方法。
Class> getPropertyType()
获得属性的 Class 对象。
Introspector 类
Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。
java.lang.Object
java.beans.Introspector
常用方法
static BeanInfo getBeanInfo(Class> beanClass)
在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。
/**
* 需求:使用 PropertyDescriptor 进行内省操作
*
* 思路:
*
* 步骤:
*
* 总结:
* 1.没有 PropertyDescriptor ,我们需要自己根据属性名字符串,解析为 getter、setter 名字符串,再用 Class 对
* 象的 getMethod 方法获取对应的 getter、setter 方法对象
* 2.有 PropertyDescriptor 之后,我们只需要传递一个属性名 字符串 + Class对象,就可直接使用 getReadMethod
* 获取到 getter 方法对象
*/
package cn.itcast.reflect;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
/**
* @class: IntrospectorDemo
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-22 上午9:15:36
* @version: 1.0
*/
public class IntrospectorDemo {
/**
* @method: main
* @description: TODO
* @param args
* @return: void
* @author: vivianZhao
* @date: 2013-7-22 上午9:15:36
* @version: 1.0
*/
public static void main(String[] args) throws Exception {
Point point = new Point(2, 5);
String proName = "x";
System.out.println(getProperty1(point, proName));
setProperty(point, proName, 8);
System.out.println(getProperty2(point, proName));
}
private static void setProperty(Point point, String proName, int value)
throws Exception {
PropertyDescriptor proDescriptor = new PropertyDescriptor(proName,
Point.class);
Method methodSetX = proDescriptor.getWriteMethod();
methodSetX.invoke(point, value);
}
private static int getProperty1(Point point, String proName)
throws Exception {
PropertyDescriptor proDescriptor = new PropertyDescriptor(proName,
Point.class);
Method methodGetX = proDescriptor.getReadMethod();
Object objx = methodGetX.invoke(point);
return Integer.parseInt(objx.toString());
}
private static int getProperty2(Point point, String proName)
throws Exception {
BeanInfo beanInfo = Introspector.getBeanInfo(point.getClass());
PropertyDescriptor[] proDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor prop : proDescriptors) {
if (prop.getName().equals(proName)) {
Method methodGetx = prop.getReadMethod();
Object objx = methodGetx.invoke(point);
return Integer.parseInt(objx.toString());
}
}
return 0;
}
}
class Point {
private Integer x;
private Integer y;
public Point() {
}
public Point(Integer x, Integer y) {
super();
this.x = x;
this.y = y;
}
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
public Integer getY() {
return y;
}
public void setY(Integer y) {
this.y = y;
}
}
/**
*
*/
package cn.itcast.reflect;
import org.apache.commons.beanutils.BeanUtils;
/**
* @class: IntrospectorDemo
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-22 上午9:15:36
* @version: 1.0
*/
public class IntrospectorDemo {
/**
* @method: main
* @description: TODO
* @param args
* @return: void
* @author: vivianZhao
* @date: 2013-7-22 上午9:15:36
* @version: 1.0
*/
public static void main(String[] args) throws Exception {
Point point = new Point(2, 5);
String propertieName = "x";
BeanUtils.setProperty(point, propertieName, "8");
System.out.println(point.getX());
System.out.println(BeanUtils.getProperty(point, propertieName));
System.out.println(BeanUtils.getProperty(point, propertieName).getClass()
.getName());
BeanUtils.setProperty(point, propertieName, 8);
System.out.println(BeanUtils.getProperty(point, propertieName).getClass()
.getName());
// 我们看到虽然属性x的类型是Integer,但是我们设置的时候无论是Integer还是String,BeanUtils的内部
// 都是当成String来处理的。
}
public static class Point {
private int x;
private int y;
public Point() {
}
public Point(Integer x, Integer y) {
super();
this.x = x;
this.y = y;
}
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
public Integer getY() {
return y;
}
public void setY(Integer y) {
this.y = y;
}
}
}
BeanUtils 操作的类必须是 public 修饰过的,所以这里吧 Point 设置 pulic static 了,把 JavaBean 放在某个类的里面,这种在正式使用的时候,估计不会有这种设计,因为 JavaBean 本来就是公开的,用来传递数据的类。
/**
* 需求:演示 BeanUtils 支持 javabean 属性的级联操作
*/
package cn.itcast.reflect;
import java.util.Date;
import org.apache.commons.beanutils.BeanUtils;
/**
* @class: BeanUtilsDemo
* @package: cn.itcast.reflect
* @description: TODO
* @author: vivianZhao
* @date: 2013-7-22 下午1:20:10
* @version: 1.0
*/
public class BeanUtilsDemo {
/**
* @method: main
* @description: TODO
* @param args
* @return: void
* @author: vivianZhao
* @date: 2013-7-22 下午1:20:10
* @version: 1.0
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Person person = new Person();
String propertyName = "birthday.time";
System.out.println(BeanUtils.getProperty(person, propertyName));
}
public static class Person {
private Date birthday;
public Person() {
birthday = new Date();
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
}
//eanUtils工具包 和logging包实现对JavaBean的操作
//利用Beanutils工具包可以对嵌套的JavaBean类中的属性进行操作
BeanUtils.setProperty(jbc, "brithday.time", 111);
System.out.println(BeanUtils.getProperty(jbc, "brithday.time"));
//PropertyUtils工具类传入的参数和拿出的参数必须和属性本身的类型一致
PropertyUtils.setProperty(jbc, "brithday.time", 123);
System.out.println(PropertyUtils.getProperty(jbc, "brithday.time"));
//利用BeanUtils工具实现JavaBean与Map的转换
Map map = BeanUtils.describe(jbc);
System.out.println(map);
BeanUtils.setProperty(map, "name", "xx");
System.out.println(map);