java api javabean包简单理解和学习

来源:互联网 发布:12306 手机 网络有问题 编辑:程序博客网 时间:2024/05/21 09:46

在DaoSupport 的构建中,为了实现通过传入的参数(为class<T>)来检测正确和构造类的实例,但是当时使用的是java的反射机制和范型来实现的。暂且不讨论范型和注解带来的不便。那么在java api中是不是还有替代上述方式来构建java bean呢?

答案是有的。

详见包java.beans.

我会通过调用

  • java.beans.Introspector.getBeanInfo(Class<?> beanClass)拿到beanInfo
  • bean.getPropertyDescriptors()拿到 beanClass中的所有的属性
    • java.beans.PropertyDescripto.getWriteMethod() /getReadMethod()去调用get/set方法
    • java.beans.Beans.instantiate(ClassLoader cls, String beanName)可以用来实例化对象

——注意:

必须注意的是java.beans.PropertyDescripto.getWriteMethod() /getReadMethod()的时候该类必须满足java bean  的格式要求,否则获取的方法对象为null.

测试代码:

package javabeans;

import java.beans.BeanDescriptor;
import java.beans.BeanInfo;
import java.beans.Beans;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration;

import org.junit.Test;
/**
* javabean确实相对于java inflect来讲要安全的多,可以通过javabean来构建对象而不用担心和学习反射机制
* @author anping
*
*/
public class testJavabean {
@Test
public void testIntrospector() throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, IOException{
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
BeanDescriptor bean = beanInfo.getBeanDescriptor();

System.out.println(“———-属性修饰器———”);
User user = new User();
user.setAge(1);
user.setUsername(“1111″);
//拿到所有的属性
PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor prop:props){
System.out.println(prop.getName());
//属性调用getXXX的方法
System.out.println(prop.getReadMethod().invoke(user, null));
}
System.out.println(“===========构建bean=========”);
Beans beans = new Beans();
Object object= (User) beans.instantiate(User.class.getClassLoader(), User.class.getName());
System.out.println(object);
for(PropertyDescriptor prop:props){
if(prop.getName().equals(“age”)){
prop.getWriteMethod().invoke(object, 11);
}else if(prop.getName().equals(“username”)){
//属性调用setXXX的方法
prop.getWriteMethod().invoke(object, “aoing”);
}
}

User user2 = (User)object;
System.out.println(user2.getAge()+user2.getUsername());//11aoping
}
}

0 0