JavaWeb_内省(Instrospector)

内省是什么?

开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都是用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作Java对象的属性。

什么是Java对象的属性和属性的读写方法?

内省访问JavaBean属性的两种方式:

1.通过ProperityDescriptor类操作Bean的属性;

2.通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获得某个属性对应的getter/setter方法,然后通过反射机制来调用这些方法。

在类中声明成员变量(private String name;)只能是叫做成员变量或者叫做字段,只有当声明了该字段的set和get方法时才能成这个成员变量为属性。

下面看使用jdkapi中的内省调用类里面的属性。

 1 package cn.itcast.instrospector;
 2
 3 import java.beans.BeanInfo;
 4 import java.beans.IntrospectionException;
 5 import java.beans.Introspector;
 6 import java.beans.PropertyDescriptor;
 7 import java.lang.reflect.Method;
 8
 9 import org.junit.Test;
10
11 public class Demo1 {
12
13     //通过内省api操作bean的name属性
14     @Test
15     public void test1() throws Exception{
16         Student s = new Student();
17
18         PropertyDescriptor pd = new PropertyDescriptor("name",Student.class);
19         Method method = pd.getWriteMethod();
20         method.invoke(s, "flx");
21         //System.out.println(s.getName());
22         method = pd.getReadMethod();
23         String result = (String) method.invoke(s, null);
24         System.out.println(result);
25     }
26
27     //操作bean的所有属性
28     @Test
29     public void test2() throws Exception{
30         BeanInfo info = Introspector.getBeanInfo(Student.class);
31         PropertyDescriptor pds[] = info.getPropertyDescriptors();
32         for(PropertyDescriptor pd:pds){
33             System.out.println(pd.getName());
34         }
35     }
36 }
 1 package cn.itcast.instrospector;
 2
 3 public class Student {
 4     private String name;
 5
 6     public String getName() {
 7         return name;
 8     }
 9
10     public void setName(String name) {
11         this.name = name;
12     }
13 }

下面看使用BeanUtils操作属性

 1 package cn.itcast.beanutils;
 2
 3 import java.lang.reflect.InvocationTargetException;
 4 import java.util.Date;
 5
 6 import org.apache.commons.beanutils.BeanUtils;
 7 import org.apache.commons.beanutils.ConvertUtils;
 8 import org.apache.commons.beanutils.converters.DateConverter;
 9 import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
10
11 public class Demo1 {
12     public static void main(String [] args) throws IllegalAccessException, InvocationTargetException{
13         String name = "fix";
14         String password = "123";
15         String age = "23";
16         String email = "[email protected]";
17         String birthday = "1990-09-09";
18
19         Student s = new Student();
20
21         ConvertUtils.register(new DateLocaleConverter(), Date.class);
22         BeanUtils.setProperty(s, "name", name);
23         BeanUtils.setProperty(s, "password", password);
24         BeanUtils.setProperty(s, "age", age);
25         BeanUtils.setProperty(s, "email", email);
26         BeanUtils.setProperty(s, "birthday", birthday);
27         System.out.println(s.getEmail());
28         System.out.println(s.getBirthday());
29     }
30
31 }

这里第21行注册了一个转化器,使日期可以转换成当地日期。下面是Student类

 1 package cn.itcast.beanutils;
 2
 3 import java.util.Date;
 4
 5 public class Student {
 6     private String name;
 7     private String password;
 8     private String email;
 9     private int age;
10     private Date birthday;
11     public String getPassword() {
12         return password;
13     }
14
15     public void setPassword(String password) {
16         this.password = password;
17     }
18
19     public String getEmail() {
20         return email;
21     }
22
23     public void setEmail(String email) {
24         this.email = email;
25     }
26
27     public int getAge() {
28         return age;
29     }
30
31     public void setAge(int age) {
32         this.age = age;
33     }
34
35     public Date getBirthday() {
36         return birthday;
37     }
38
39     public void setBirthday(Date birthday) {
40         this.birthday = birthday;
41     }
42
43     public String getName() {
44         return name;
45     }
46
47     public void setName(String name) {
48         this.name = name;
49     }
50 }

但是,如果我们输入的数据类型没有对应的转化器,我们就要自己写一个转换器。

下面看如何写一个转换器。

 1 package cn.itcast.beanutils;
 2
 3 import java.lang.reflect.InvocationTargetException;
 4 import java.text.ParseException;
 5 import java.text.SimpleDateFormat;
 6 import java.util.Date;
 7
 8 import org.apache.commons.beanutils.BeanUtils;
 9 import org.apache.commons.beanutils.ConversionException;
10 import org.apache.commons.beanutils.ConvertUtils;
11 import org.apache.commons.beanutils.Converter;
12 import org.apache.commons.beanutils.converters.DateConverter;
13 import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
14
15 public class Demo1 {
16     public static void main(String [] args) throws IllegalAccessException, InvocationTargetException{
17         String name = "fix";
18         String password = "123";
19         String age = "23";
20         String email = "[email protected]";
21         String birthday = "1990-09-09";
22
23         Student s = new Student();
24
25         //自己设计转换器
26         ConvertUtils.register(new Converter(){
27             public Object convert(Class type,Object value){//"1980-09-09"
28                 if(value==null){
29                     return null;
30                 }
31                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
32                 Date date = null;
33                 try {
34                     date = format.parse((String) value);
35                 } catch (ParseException e) {
36                     // TODO Auto-generated catch block
37                     e.printStackTrace();
38                     throw new ConversionException(e);
39                 }
40                 return date;
41             }
42         }, Date.class);
43         BeanUtils.setProperty(s, "name", name);
44         BeanUtils.setProperty(s, "password", password);
45         BeanUtils.setProperty(s, "age", age);
46         BeanUtils.setProperty(s, "email", email);
47         BeanUtils.setProperty(s, "birthday", birthday);
48         System.out.println(s.getEmail());
49         System.out.println(s.getBirthday());
50     }
51
52 }

以上就是内省的一些使用技巧,这里在能用到BeanUtils是尽量用BeanUtils。

时间: 2024-10-29 19:12:07

JavaWeb_内省(Instrospector)的相关文章

内省 Instrospector

public void populate(Map<String, String[]> map, Person user) throws Exception { BeanInfo info = Introspector.getBeanInfo(user.getClass()); // 获取属性的描述 PropertyDescriptor [] pds = info.getPropertyDescriptors(); // 循环遍历 for (PropertyDescriptor pd : pds

JAVA中反射机制五(JavaBean的内省与BeanUtils库)

内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”.方法比较少.这些信息储存在类的私有变量中,通过set().get()获得. 例如类UserInfo : package com.peidasoft.in

【DAY24】内省,NIO的学习笔记

java.lang.Class java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Constructor //static代码块 Class.forName("",boolean , ClassLoader); JVM结构 ---------------- Ru.ntime Data Area 1.Method Area //方法区. 共享 2.Heap //存放对象和数组.共享 //Data acce

JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到sessi

Java内省

大家都知道,Java给我提供了反射机制,使我们可以获取到每一个类的每一个属性和方法,并对此进行操作.但是利用反射来操作对象时过于麻烦,所以sun公司就基于反射机制给大家提供了一个更加简单实用的api,那就是内省(Introspector),而内省这套api将会使我们操作JavaBean的属性更加方便. 1.什么是Javabean? ①类必须是公共的 ②类必须具备无参构造器 2.什么是Javabean的属性? 要理解内省的概念,我们先来理解一下什么叫Javabean的属性,下面我们猜下该Javab

Java 内省 Introspector

操纵类的属性,有两种方法 反射 内省 面向对象的编程中,对于用户提交过来的数据,要封装成一个javaBean,也就是对象 其中Bean的属性不是由字段来决定的,而是由get和Set方法来决定的 public class Person { private String name ; private String password; private int age; public String getName() { return name; } public void setName(String

内省Introspector 和BeanUtils 工具对反射属性的包装(简单的不是一点点哦)

public void fun2() throws Exception { //通过反射和dom4j实例化id=stu1的对象,并输出 SAXReader reader = new SAXReader(); Document document = reader.read(this.getClass().getResourceAsStream("/beans.xml")); String xpath="/beans/bean[@id=\"stu1\"]&qu

内省(Introspector)

内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object),或"VO".方法比较少.这些信息储存在类的私有变量中,通过set().get()获得. 例如类UserInfo : package

内省Introspector(反射操作javaBean)

一:内省是一种特殊的反射,来更方便的操作javaBean对象,通过内省可以获取到类字节码的描述器, 然后解剖每一个字段,获取每个字段的读写方法,即get/set方法的反射,然后获取或者是封装bean的value 下面是通过内省向Bean中set值得示例: public static <T> T toBean(T t){ Class<?> clazz = t.getClass(); try { //根据Class对象获取该类的BeanInfo信息 BeanInfo beanInfo