黑马程序员_王康 javaBean

 

内省和反射是等同的,只不过那些强调动态改变,加载的反射我们可以称之为内省
 比如动态 的创建类我们可以称为是内省.比如从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)); 
            } 
        } 
    } 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在51单片机中使用OLED显示“张玉树,王康笼,王鹏”的代码: ```c #include <reg52.h> #include <intrins.h> #define OLED_SCL P2_1 #define OLED_SDA P2_0 void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 114; j++); } void OLED_WriteCmd(unsigned char cmd) { unsigned char i; OLED_SCL = 0; for (i = 0; i < 8; i++) { OLED_SDA = (cmd & 0x80) >> 7; OLED_SCL = 1; OLED_SCL = 0; cmd <<= 1; } } void OLED_WriteData(unsigned char dat) { unsigned char i; OLED_SCL = 0; for (i = 0; i < 8; i++) { OLED_SDA = (dat & 0x80) >> 7; OLED_SCL = 1; OLED_SCL = 0; dat <<= 1; } } void OLED_Init() { OLED_WriteCmd(0xAE); // 关闭OLED显示 OLED_WriteCmd(0x00); // 设置低列地址 OLED_WriteCmd(0x10); // 设置高列地址 OLED_WriteCmd(0x40); // 设置起始行地址 OLED_WriteCmd(0xB0); // 设置页地址 OLED_WriteCmd(0x81); // 对比度设置 OLED_WriteCmd(0xFF); // 亮度调节 OLED_WriteCmd(0xA1); // 设置段重定向 OLED_WriteCmd(0xA6); // 正常显示 OLED_WriteCmd(0xA8); // 多路复用设置 OLED_WriteCmd(0x3F); // 多路复用设置 OLED_WriteCmd(0xC8); // 垂直扫描设置 OLED_WriteCmd(0xD3); // 设置显示偏移 OLED_WriteCmd(0x00); // 设置显示偏移 OLED_WriteCmd(0xD5); // 设置显示时钟分频 OLED_WriteCmd(0x80); // 设置显示时钟分频 OLED_WriteCmd(0xD9); // 设置预充电周期 OLED_WriteCmd(0xF1); // 设置预充电周期 OLED_WriteCmd(0xDA); // 设置COM硬件引脚配置 OLED_WriteCmd(0x12); // 设置COM硬件引脚配置 OLED_WriteCmd(0xDB); // 设置VCOMH OLED_WriteCmd(0x40); // 设置VCOMH OLED_WriteCmd(0xAF); // 打开OLED显示 } void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *str) { unsigned char i = 0; while (str[i] != '\0') { OLED_WriteCmd(0xB0 + y); OLED_WriteCmd(((x & 0xF0) >> 4) | 0x10); OLED_WriteCmd((x & 0x0F) | 0x01); for (; str[i] != '\0' && i < 16; i++) { OLED_WriteData(str[i]); x++; } if (str[i] == '\0') break; y++; x = 0; } } void main() { OLED_Init(); OLED_ShowString(0, 0, "张玉树,王康笼,王鹏"); while (1); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值