javaBean :
Bean 为符合某种规范的组件,也就是java类,对于组件来说,关键在于要具有“能够被IDE构建工具侦测其属性和事件”的能力。
JavaBean 的命名规则:
1:对于一个xxx 的属性,通常要写两个getXxx()和setXxx(),任何浏览这些方法的工具,都会把set或get后面的第一个字母转换成为小写。
2:对于布尔型属性,可以商用以上set和get的方式,不过可以把get换成is。
3:Bean的普通方法不必遵循以上的命名规则,但是必须是public的。
内省的概念:
内省是java语言对Bean类属性,事件的一种缺省处理方法。例如类A中的属性name,我们可以通过getNane ()setName()来得到其值或设置新的值,通过setName/getName 来访问属性,这是默认的规则,
Java 中提供了一套API 访问某个属性
ntrosepector 类:
Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。
static BeanInfo getBeanInfo (Class<?> beanClass): 在JavaBean上进行内省,了解其属性,公开方法和事件。
BeanInfo 类:
该类实现此BeanInfo接口并提供有关其bean的方法,属性,事件扥显示信息。
PropetryDescriptor 类:
描述javaBean 通过一对存储器方法导出的一个属性
MethodDescriptor 类:
描述了一种特殊方法,即 Java Bean 支持从其他组件对其进行外部访问。
实现如下:
一:创建一个javaBean:
public class Dog {
public Dog (){
}
private String name ;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
}
二:创建工厂类:
/*
* 工厂类
*/
public class DogFactory {
//属性文件操作类。
private static Properties config = new Properties();
static {
// 读取属性文件
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("bean.properties");
// 加载属性文件
try {
config.load(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Dog getDog(String name) {
try {
String classname = config.getProperty(name);
// 根据类全程获取类信息(class对象)【反射】
Class dogclass = Class.forName(classname);
// 实例化对象(反射)
Dog dog = (Dog)dogclass.newInstance();
// 内省:获取bean的详细信息
BeanInfo beanInfo = Introspector.getBeanInfo(dogclass);
// 通过bean信息获取所有属性描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
// 循环遍历属性描述器
for (int i = 0; i < pds.length; i++) {
if ("name".equals(pds[i].getName())) { // 判断对应哪个属性
String nameValue = config.getProperty("dog.name");
// 通过该属性获取写的方法
Method method = pds[i].getWriteMethod();
// 在dog 对象上调用方法
method.invoke(dog, nameValue);
} else if ("age".equals(pds[i].getName())) {
String agevalue = config.getProperty("dog.age");
Method method = pds[i].getWriteMethod();
method.invoke(dog, Integer.parseInt(agevalue));
}
}
return dog;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
三: 创建配置文件:
# 配置属性文件(方便修改修改后不需编译保存即可)
dog=com.xiyou.neixing.Dog
dog.name=\u5c0f\u767d
dog.age =3
四:创建测试类:
public class InstrospectorDemo {
public static void main(String[] args) {
Dog dog = DogFactory.getDog("dog");
System.out.println(dog);
}
}