Java高新技术:框架,类加载器方式,JavaBean,内省,BeanUtils工具包

来源:互联网 发布:python dat文件格式 编辑:程序博客网 时间:2024/06/06 03:26

框架

1、框架:通过反射调用Java类的一种方式。

        如房地产商造房子用户住,门窗和空调等等内部都是由用户自己安装,房子就是框架,用户需使用此框架,安好门窗等放入到房地产商提供的框架中。

        框架和工具类的区别:工具类被用户类调用,而框架是调用用户提供的类。

2、框架理解

        我们在写框架(造房子的过程)的时候,调用的类(安装的门窗等)还未出现,那么,框架无法知道要被调用的类名,所以在程序中无法直接new其某个类的实例对象,而要用反射来做。

3、简单框架程序的步骤:

        1)右击项目File命名一个配置文件如:config.properties,然后写入配置信息。如键值对:className=java.util.ArrayList,等号右边的配置键,右边是值。

        2)代码实现,加载此文件:

                ①将文件读取到读取流中,要写出配置文件的绝对路径。

                    如:InputStream is=new FileInputStream(“配置文件”);

                ②用Properties类的load()方法将流中的数据存入集合。

                ③关闭流:关闭的是读取流,因为流中的数据已经加载进内存。

        3)通过getProperty()方法获取className,即配置的值,也就是某个类名。

        4)用反射的方式,创建对象newInstance()

        5)执行程序主体功能


类加载器方式管理资源和配置文件

类加载器是将.class的文件加载进内存,也可将普通文件中的信息加载进内存

配置文件的路径问题:

 绝对路径,通过getRealPath()方法运算出来具体的目录,而不是内部编码出来的。

        一般先得到用户自定义的总目录,在加上自己内部的路径。可以通过getRealPath()方法获取文件路径。对配置文件修改是需要要储存到配置文件中,那么就要得到它的绝对路径才行,因此,配置文件要放到程序的内部。

        2name的路径问题:

                ①如果配置文件和classPath目录没关系,就必须写上绝对路径,

                ②如果配置文件和classPath目录有关系,即在classPath目录中或在其子目录中(一般是资源文件夹resource),那么就得写相对路径,因为它自己了解自己属于哪个包,是相对于当前包而言的。


JavaBean

一个类中含有set与get方法,都可以称作JavaBean类。

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。

这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。

利用反摄:一般来说通过get方法与set方法可以获取和操作JavaBean类中的属性,但是在框架设计中,事先并不知道get和set哪一个成员属性。需要通过反射来完成。

而通过反射获取set和get方法相对麻烦,于是SUN公司提供了对JavaBean类进行操作的一些API————内省

package com.sf.test;public class TestJavaBeans {/** * @param args */private int x;private int y;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}}

注:以下代码,以后建议使用简单的内省操作,不使用需要遍历的复杂操作

package com.sf.test;import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class WeekDay {/** * @param args * @throws Exception  */public static void main(String[] args) throws Exception {// TODO Auto-generated method stubString propertyName="x";TestJavaBeans test=new TestJavaBeans();test.setX(4);test.setY(5);    <span><span class="comment">//用内省的方式</span><span> </span></span>                 PropertyDescriptor properties=new PropertyDescriptor(propertyName, test.getClass());//Method getMethod=properties.getReadMethod();//getMethod.invoke(test);System.out.println(getProperty(propertyName,test));setProperty(propertyName, test);//System.out.println(getMethod.invoke(test));System.out.println(test.getX());//复杂内省操作,通过BeanInfo获取BeanInfo实例,再通过实例获取所有属性描述,再遍历BeanInfo beanInfo=Introspector.getBeanInfo(test.getClass());PropertyDescriptor[] propertyDescriptors=beanInfo.getPropertyDescriptors();Object retval;               //遍历                for(PropertyDescriptor propertyDescriptor:propertyDescriptors){if(propertyDescriptor.getName().equals(propertyName)){Method methodGet=propertyDescriptor.getReadMethod();retval=methodGet.invoke(test);break;}}}private static void setProperty(String propertyName, Object object)throws IntrospectionException, IllegalAccessException,IllegalArgumentException, InvocationTargetException {PropertyDescriptor properties1=new PropertyDescriptor(propertyName, object.getClass());<span><span class="comment">//创建对象关联</span><span></span></span>Method setMethod=properties1.getWriteMethod();<span><span class="comment">//获取JavaBean类中的set方法</span><span></span></span>setMethod.invoke(object, 10);//调用方法}private static Object getProperty(String propertyName, Object object)throws IllegalAccessException, InvocationTargetException, IntrospectionException {PropertyDescriptor properties=new PropertyDescriptor(propertyName, object.getClass());Method getMethod=properties.getReadMethod();Object retval=getMethod.invoke(object);return retval;}}



BeanUtils工具包

Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性——BeanUtils
注意:BeanUtils包依赖于logging包,所以两个包都有导入。

BeanUtils类的方法非常简单:
static StringgetProperty(Object bean, String name)static voidsetProperty(Object bean, String name, Object value)
注:
1.BeanUtils工具类在对对象的属性进行操作的时候,会自动进行类型转换。例如tPoint类中的x属性为int类型,
但是设置属性值的时候传入的参数却可以是String类型,返回的也是String类。这是因为内部发生了自动类型转换。这是为了以后开发方便起见。

2.BeanUtils工具类可以对属性进行级联操作,例如Point类还有 变量Private Date Birthday ,而Date(java.util.Date)类中有setTime方法,那么也就相当于Date类型对象有一个time属性,BeanUtils就可以对其进行操作:
BeanUtils. setProperty(pt, "birthday.time", "111");


BeanUtils工具包里有很多类,比如PropertyUtils类,他与BeanUtils类的区别在于不会自动类型转换。


0 0
原创粉丝点击