Java-内省(学习笔记)
来源:互联网 发布:python snmp 系统监控 编辑:程序博客网 时间:2024/06/05 15:44
1.内省:通过内省可以获取一个类的内部信息,方法、属性、构造函数等。
2.与反射的区别:
①内省是针对Javabean对象的,符合Javabean规则的类的成员才可以使用内省操作;反射是针对普通类的。
②内省先得到属性描述PropertyDecriptor后再进行其他操作;反射先得到类的字节码Class后再进行其他操作。
3.JavaBean:学习内省需要知道什么是javabean。
①实体类,用来封装数据、重用;
②符合一定规范书写的java类,不是一种技术而是一种规范;
③这个类是public,所有的属性为private,通过get、set方法进行访问。
④javabean实例:
package introspector;public class Person {//javabeanprivate 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());}
- Java-内省(学习笔记)
- [学习笔记]Java内省机制(JavaBean)
- Java学习笔记-JavaBean-内省(Introspector)
- 黑马程序员-java内省学习笔记
- 学习笔记 --内省
- JavaSE学习笔记--内省
- Java内省的学习
- 黑马程序员Java学习笔记__javaBean的内省机制
- 黑马程序员-内省学习笔记
- {学习笔记}[内省]
- Java 高新技术(内省)
- Java Introspector(内省)
- java笔记(三)——内省技术
- Java学习之提高:内省和注解(顺带一提泛型)
- --内省和JavaBean--java学习日记13(高新技术)
- 黑马程序员-Java学习(高新)17-内省,注解
- 学习笔记之内省和JavaBean
- 黑马程序员_学习笔记内省
- RBF_PID_Qt&plot
- LightOJ
- JS中'6 || 7'返回值
- cout输出浮点数指定位数
- mfc获取系统时间
- Java-内省(学习笔记)
- LeetCode 268. Missing Number (Easy)
- 运营活动系统的流程总结
- C语言输入一行信息
- HTML标签
- QCustomPlot的legend图例背景透明的方法
- 快排
- 学习Linux C编程之数据类型 问题-extern及static修饰全局变量的区别
- nagios插件之发起http的purchase购买请求