如要转载请标明作者zjrodger和出处:http://blog.csdn.net/zjrodger/,谢谢。
笔记目录
(·) 由内省引出JavaBean的讲解
(·) BeanUtils工具包操作JavaBean
1.
BeanUtils工具包的安装和配置
2. common-logging日志开发包的安装和配置
3. 常见错误——要操作的那个目标Bean类必须是public的
|
(·) 由内省引出JavaBean的讲解
1. 什么是JavaBean
JavaBean是一种Java的特殊类,主要用于传递数据,这种类中的方法主要用于访问private字段,而且方法名是符合某种命名规范来命名的。
比如:
class Person{
private int age;
public Person(){......}
int getAge(){}
void setAge(int age){}
}
Person类的定义就是一个典型的JavaBean。
注意:
(1)JavaBean的一个重要特性,JavaBean必须要有一个无参构造器。
Introspector--------> JavaBean -------> 特殊的Java类
2. 何为内省
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。
3. PropertiyDescriptor
Construct a PropertyDescriptor for a property that follows the Java Standard Convention by having getFoo and setFoo
accessor methods.
(1)
代码示例:
package com.zjrodger;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 内省的简单应用。
* **/
class Person04{
private int age;
private String name;
public Person04(){}
public Person04(String name, int age){
this.name = name;
this.age = 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 Introspector {
public static void main(String[] args) {
try {
Person p1 = new Person("zjrodger",26);
String propertyName = "age";
PropertyDescriptor pd = new PropertyDescriptor(propertyName, p1.getClass());
Method readMethod = pd.getReadMethod();
Object returnedValue = readMethod.invoke(p1, null);
System.out.println(returnedValue);
Method writeMethod = pd.getWriteMethod();
writeMethod.invoke(p1, 20);
Method readMethod02 = pd.getReadMethod();
Object returnedValue02 = readMethod02.invoke(p1, null);
System.out.println(returnedValue02);
System.out.println(p1.getAge());
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
(·) BeanUtils工具包操作JavaBean
1. BeanUtils工具包的安装和配置
(1) 在Apache官方上下载BeanUtils工具包,
(2)
通过MyEclipse,在自己某个项目工程目录下创建一个名为lib的文件夹,并且将新下载的工具解压缩,然后将解压缩后的“commons-beanutils-1.9.2.jar”拷贝到lib文件夹下边。
如下图所示:
若通过“propertyes---->Add External Jars”的方法,则在自己的主机上可以成功使用该工具,若要在其他的主机上,则不能使用该工具,因为“Add External Jars”方法,只是将BeanUtils位于本地磁盘的路径传给了MyEclipse,并没有将BeanUtils工具拷贝到项目的工程中。
(3)
将复制到项目工程中的commons-beanutils-1.9.2.jar包添加到“Build Path”中去。
具体做法如下图所示:
(3.1) 步骤:右击“commons-beanutils-1.9.2.jar”--------> Build Path --------> Add to Build Path
(3.2) 结果:commons-beanutils-1.9.2.jar的图标会改变。
A.原来的图标: |
B.加入到Build Path后的图标 多了一个Referenced Libraries,并且下边多了一个文件。 |
2. common-logging日志开发包的安装和配置
【错误再现】
在运行代码"
BeanUtils.getProperty(p1, "age")
"时,出现下述错误:
错误信息:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
|
【原因分析】
缺少日志开发包(logging包),该包是Apache提供的。在开发Spring,Struts,Hibernate时会经常使用日志开发包。
【解决方案】
下载common-logging工具包,并且在MyEclipse/Eclipse中进行相关配置。
(1) 在Apache官方上下载common-logging工具包,
(2) 通过MyEclipse中,在自己某个项目工程目录下创建一个名为lib的文件夹,并且将新下载的工具解压缩,然后将解压缩后的“commons-beanutils-1.9.2.jar”拷贝到lib文件夹下边。
3. 常见错误——要操作的那个目标Bean类必须是public的
【错误再现】
1.
BeanUtils工具包的安装和配置正确。
2.
common-logging日志开发包的安装和配置。
3. 作为Bean类的Person04的属性和方法的定义均符合JavaBean的规范。
4. 作为Bean类的Person04和BeanUtilsTest类写在了同一个名为BeanUtilsTest的java文件中。
5. 在运行代码"BeanUtils.getProperty(p1, "age")"时,出现下述错误:
java.lang.NoSuchMethodException: Property 'name' has no getter method in class 'class com.zjrodger.Person04'
|
【错误代码】
package com.zjrodger;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.commons.beanutils.BeanUtils;
/**
* 内省的简单应用。
* **/
class Person04{
private int age;
private String name;
public Person04(){}
public Person04(String name, int age){
this.name = name;
this.age = 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 BeanUtilsTest {
public static void main(String[] args) {
try {
Person04 p1 = new Person04("aaa",8);
String propertyName = "name";
System.out.println("name = "+BeanUtils.getProperty(p1, propertyName));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
【原因分析】
即,要操作的那个目标Bean类必须是public的。
应该把Person04类的定义写在另一个java文件中,根据Bean的规范,每一个Bean类都应该单独写在一个java文件中