反射封装类的数据
public class PersonFactory {
public static Object newInstance(){
Object object=null;
try {
//只能是在这个方法内进行读取这个文件,然后再进行封装数据了
//创建一个输入流
BufferedReader br=new BufferedReader(new FileReader("obj.txt"));
//进行读取第一行数据
String classpath=br.readLine();
Class clazz=Class.forName(classpath);
Constructor constructor=clazz.getConstructor();
object=constructor.newInstance();//空参数的数据
//进行读取字段中数据
String line=null;
while((line=br.readLine())!=null){
String data[]=line.split("=");
//进行封装数据,得到字段
Field field=clazz.getDeclaredField(data[0]);
field.setAccessible(true);//设置一下可访问的权限
//进行判断一下我们的字段的类型
if(field.getType()==Integer.class){
field.set(object,Integer.parseInt(data[1]));
}else if(field.getType()==String.class){
field.set(object,data[1]);
}//其他的类型这里就不用说了,也是这样子的判断就可以了
}
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
public static void main(String[] args) {
Person p=(Person) PersonFactory.newInstance();
System.out.println(p);
}
}
内省封装类的数据,要用到我们有JavaBean当中的set/get方法,这种方式有点麻烦,但是我们的apache组织用内省的技术给我们封装了一个api,这个Api就会很方便我们的来操作这个JavaBean了
public class IntrospectorTest {
//得到这个类的所有的成员
@Test
public void getAllField() throws Exception{
BeanInfo info=Introspector.getBeanInfo(Emp.class);
//得到类中所有的成员
PropertyDescriptor[] descs=info.getPropertyDescriptors();
//进行遍历成员
for(PropertyDescriptor p:descs){
System.out.println(p.getPropertyType());
}
}
public static void main(String[] args) throws Exception {
//使用内省的操作
//创建对象
Emp p=new Emp();
//设置对象的成员的值,用到的是粗性描述器对象
PropertyDescriptor desc=new PropertyDescriptor("name",Emp.class);//表示的是用到那个的类的那个成员
//给这个成员设置值
Method m1=desc.getWriteMethod();//得到set方法
//进行方法的调用
m1.invoke(p,"yanghailong");
//得到我们成员的值
Method m=desc.getReadMethod();//得到的是我们的Get方法
m.invoke(p,null);//get方法没有参数
System.out.println(p);
}
}
Apache组织的利用内省封装的BeanUtils技术操作JavaBean的基本的操作如下:
/**
这个操作不用考虑到我们的数据的类型
使用步聚如下:
1.1导包:commons-logging.jar,commons-beanutils-1.8.0.jar
1.2最关键的二个Api如下:BeanUtils.setProperty和ConvertUtils.register(主要是用来注册转换的数据类型的)
因为这个BeanUtils当中只有是基本的数据类型时都会自动帮我们进行转换,如果是引用的数据类型我们只有进行手动的注册数据的
转换类型,当然也可以手动转换好类型后再进行设置值
*/
public class MyBeanUtilsDemo {
@Test
public void beanTest() throws Exception{
//创建对象
Emp emp=new Emp();
//封装成员
BeanUtils.setProperty(emp,"name","yanghailong");
BeanUtils.setProperty(emp,"id","23");//如果是基本的数据类型,那么这个数据会自动帮助我们的转换
ConvertUtils.register(new Converter() {
@Override
public Object convert(Class type, Object value) {
Date data;
try {
//创建一个SimpleDateFormat
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
data = format.parse((String)value);
return data;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}, Date.class);
//如果是复杂的数据类型,那么要进行注册一个数据转换器,同时也可以自己转换好数据的类型然后再进行设置数据
BeanUtils.setProperty(emp,"birthday","2017-12-8");
System.out.println(emp);
}
}