java 内省机制


javaBean 

  Bean 为符合某种规范的组件,也就是java类,对于组件来说,关键在于要具有“能够被IDE构建工具侦测其属性和事件”的能力。

JavaBean 的命名规则:

1:对于一个xxx 的属性,通常要写两个getXxx()和setXxx(),任何浏览这些方法的工具,都会把setget后面的第一个字母转换成为小写。

2:对于布尔型属性,可以商用以上setget的方式,不过可以把get换成is

3Bean的普通方法不必遵循以上的命名规则,但是必须是public的。

内省的概念:

 内省是java语言对Bean类属性,事件的一种缺省处理方法。例如类A中的属性name,我们可以通过getNane ()setName()来得到其值或设置新的值,通过setName/getName 来访问属性,这是默认的规则,

Java 中提供了一套API 访问某个属性

ntrosepector 类:

Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。

 static BeanInfo getBeanInfo Class<?> beanClassJavaBean上进行内省,了解其属性,公开方法和事件。

 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);

}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值