在反射的应用中,我们已经能够从底层进行操作对象,但是代码经常无法复用,伟大的组织apache为我们提供了一个BeanUtils工具,方便我们来操作javaBean。
BeanUtils可以方便JavaBean的哪些方面呢,通常可以用来对JavaBean属性进行赋值,对象进行赋值,还有可以将一个Map集合的数据拷贝到一个javaBean中,下面我就来演示一下怎么进行操作。
第一步:导入jar包,commons-beanUtils和commons-logging.
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.8.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
第二步:提供一个对象吧
package com.kg.maven;
public class User {
private String name;
/**
* @return the name
*/
public synchronized String getName() {
return name;
}
/**
* @param name the name to set
*/
public synchronized void setName(String name) {
this.name = name;
}
public User(String name) {
super();
this.name = name;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "User [name=" + name + "]";
}
public User() {
super();
// TODO Auto-generated constructor stub
}
}
第三步,写个工具类
package com.kg.maven;
import java.lang.reflect.Field;
import javax.swing.text.TabableView;
import org.apache.commons.beanutils.BeanUtils;
public class BeanUtilCommon {
public static <T> T copayProperties(T origin){
T target=null;
try {
System.out.println("jinlai l");
Class clazz=origin.getClass();
target=(T) clazz.newInstance();
System.out.println("target"+target);
Field[] fields=clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
BeanUtils.setProperty(target, field.getName(), field.get(origin));
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return target;
}
}
然后测试一下
package com.kg.maven;
public class TestBeanUtils {
public static void main(String[] args) {
User user=new User("zhangsan");
User user1=BeanUtilCommon.copayProperties(user);
System.out.println(user1);
}
}
结果报错了
java.lang.InstantiationException: com.kg.maven.User
at java.lang.Class.newInstance0(Class.java:357)
at java.lang.Class.newInstance(Class.java:325)
at com.kg.maven.BeanUtilCommon.copayProperties(BeanUtilCommon.java:14)
at com.kg.maven.TestBeanUtils.main(TestBeanUtils.java:6)
null
这个异常的原因是,反射创建对象时,默认调用无参构造,因为User没有提供无参构造,所以就报了这个java.lang.InstantiationException,加上就好了.