现在的位置: 首页 > 综合 > 正文

黑马程序员__内省

2013年03月04日 ⁄ 综合 ⁄ 共 2443字 ⁄ 字号 评论关闭

----------------------android培训java培训、期待与您交流!
----------------------------------------

------------
 内省和反射是等同的,只不过那些强调动态改变,加载的反射我们可以称之为内省
 比如动态 的创建类我们可以称为是内省.比如从properties文件赋值

内省(IntroSpector):jdk 中提供了对 JavaBean 进行操作的一些 API ,这套 API 就称为内省。用内省这套 API 来操作 JavaBean 比用普通类的方式更方便。
内省是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)

JavaBean: 是一个特殊(比一般类多了自己的特性)的 Java 类,它的方法要有get()、set() 方法。一个 JavaBean 类可以当做普通的类来使用,但是一个普通的类并不一定可以当作 JavaBean 来操作。因为它不一定符合 JavaBean 的规则。
功能:主要用于传递数据信息,这种 Java 类中的方法要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递多个信息,可以将这些信息缝扎un个到一个 JavaBean 中,这种 JavaBean 的实例对象通常称之为值对象(Value Object ,简称 VO)。这些信息在类中有私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。

用内省来操作 JavaBean ,先读取 JavaBean 的值,再设置 JavaBean 的属性值。
public class A { 
 
    public static void main(String[] args) throws Exception { 
        B b = new B(); 
        PropertyDescriptor pd = new PropertyDescriptor("name", b.getClass()); //搜索到b及b的成员name;
        Method m1 = pd.getWriteMethod();// 获取操作b成员的方法
        m1.invoke(b, "郭");  //操作
 
        Method m2 = pd.getReadMethod(); // 获取get()方法 
        Object obj = (String) m2.invoke(b);//m2通过.invoke()代理了b,可以操作b成分
        System.out.println(obj); 
    } 

class B { 
 
    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; 
    } 

PS: Object invoke(Object obj, Object... args) obj-从中调用底层方法的对象 args-用于方法调用的参数
          对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
------
另一种方式:按照 BeanInfo 获取类

public class A { 
 
    public static void main(String[] args) throws Exception { 
        B b = new B();

        BeanInfo beanInfo = Introspector.getBeanInfo(b.getClass()); // 从一个类的字节码中以 JavaBean 的方式读取类信息 

        PropertyDescriptor[] getPropertyDescriptors = beanInfo 
                .getPropertyDescriptors(); // 获取这个 JavaBean 对象中的所有属性 
        for (PropertyDescriptor propertyDescriptor : getPropertyDescriptors) { 
            if (propertyDescriptor.getName().equalsIgnoreCase("name")) { // 判断这个属性名是否是我们想要的 

                Method write = propertyDescriptor.getWriteMethod(); 
                write.invoke(b, "郭"); 
                Method read = propertyDescriptor.getReadMethod(); 
                System.out.println(read.invoke(b, null)); 
            } 
        } 
    } 

PS:BeanInfo 接口:希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类,该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。
Introspector 类:提供工具获得某个目标 Java Bean 支持的特性、事件和方法的一个标准方式。

----------------------android培训java培训、期待与您交流!
----------------------详细请查看:
http://edu.csdn.net/heima(日记必用代码)

抱歉!评论已关闭.