Java-内省(学习笔记)

1.内省:通过内省可以获取一个类的内部信息,方法、属性、构造函数等。

2.与反射的区别:

①内省是针对Javabean对象的,符合Javabean规则的类的成员才可以使用内省操作;反射是针对普通类的。

②内省先得到属性描述PropertyDecriptor后再进行其他操作;反射先得到类的字节码Class后再进行其他操作。

3.JavaBean:学习内省需要知道什么是javabean。

①实体类,用来封装数据、重用;

②符合一定规范书写的java类,不是一种技术而是一种规范;

③这个类是public,所有的属性为private,通过get、set方法进行访问。

④javabean实例:

package introspector;

public class Person {//javabean
	private String name;//字段,提供了get或set方法的为属性
	private String password;
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

说明:bean到底拥有什么属性,不由字段决定,而由get或set决定。上面的例子中,这个bean共有四个属性,任何类都是object孩子,object类中有一个getclass方法,这个类继承了getclass方法,所以还有一个class属性。

一、使用内省api操作bean的属性

①使用getBeanInfo()方法,在JavaBean上进行内省,获取所有的属性、公开的方法和事件,所有属性封装到BeanInfo对象中。

②拿到BeanInfo相当于拿到bean的所有属性。

③接着调用getPropertyDescriptors()获取所有属性的属性描述器,返回的是一个数组。

④进而使用getReadMethod读取属性值,使用getReadMethod写入属性值。

实例:

(1)得到bean的所有属性

package introspector;  
  
import java.beans.BeanInfo;  
import java.beans.IntrospectionException;  
import java.beans.Introspector;  
import java.beans.PropertyDescriptor;  
  
import org.junit.Test;  
  
//使用内省api操作bean的属性  
public class demo1 {  
    @Test单元测试  
    //得到bean的所有属性  
    public void test1() throws Exception{  
        BeanInfo info = Introspector.getBeanInfo(Person.class,Object.class);  
        PropertyDescriptor[] pds = info.getPropertyDescriptors();  
        for(PropertyDescriptor pd:pds){  
            System.out.println(pd.getName());  
        }  
    }  
}  


--上述运行结果为:




可以看到上面的结果中包含了一个class属性,是继承了父类Object而来的。

有些时候我们不想要class属性,而只要它自身的属性,该如何修改代码?

public class demo1 {  
    @Test  
    public void test1() throws Exception{  
        BeanInfo info = Introspector.getBeanInfo(Person.class,Object.class);//去掉(stop)想要去掉的属性  
        PropertyDescriptor[] pds = info.getPropertyDescriptors();  
        for(PropertyDescriptor pd:pds){  
            System.out.println(pd.getName());  
        }  
    }  
}  

--结果:


(2)操作bean的指定属性,以age为例:

package introspector;  
  
import java.beans.BeanInfo;  
import java.beans.IntrospectionException;  
import java.beans.Introspector;  
import java.beans.PropertyDescriptor;  
import java.lang.reflect.Method;  
  
import org.junit.Test;  
  
//使用内省api操作bean的属性  
public class demo1 {  
    //操作bean的指定属性:age  
    @Test  
    public void test2() throws Exception{  
        Person p = new Person();  
        PropertyDescriptor pd = new PropertyDescriptor("age",Person.class);  
        //得到属性的写方法,为属性赋值  
        Method method = pd.getWriteMethod();  
        method.invoke(p, 20);  
        //获取属性的值  
        method = pd.getReadMethod();      
        System.out.println(method.invoke(p, null));  
        //传统方法:System.out.println(p.getAge());  
    }  
}  


(3)获取当前操作的属性的类型

 public void test3() throws Exception{    
	  Person p = new Person();    
	  PropertyDescriptor pd = new PropertyDescriptor("age",Person.class);    
	  System.out.println(pd.getPropertyType());}    

   






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值