框架
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()方法获取文件路径。对配置文件修改是需要要储存到配置文件中,那么就要得到它的绝对路径才行,因此,配置文件要放到程序的内部。
2)name的路径问题:
①如果配置文件和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 stub
String 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工具包
static String | getProperty(Object bean, String name) |
static void | setProperty(Object bean, String name, Object value) |
2.BeanUtils工具类可以对属性进行级联操作,例如Point类还有 变量Private Date Birthday ,而Date(java.util.Date)类中有setTime方法,那么也就相当于Date类型对象有一个time属性,BeanUtils就可以对其进行操作: