【Java EE 学习第23天】【log4j的使用】【ant的使用】【内省】

一、ant下载地址:http://ant.apache.org/bindownload.cgi 

二、log4j下载地址:http://logging.apache.org/log4j/2.x/download.html

三、内省

  1.什么是内省。

    本质上是反射,具体技术由sun替公司提供,集成到了jdk中,可以根据字段名称(String)和字节码对象得到该字段的一个描述:PropertyDescriptor,并由此得到该字段的get、set方法(Method)。

  将要使用的JavaBean

 1 package com.kdyzm.domain;
 2
 3 import java.util.Date;
 4
 5 public class Person {
 6     private String name;
 7     private Integer age;
 8     private Date date;
 9
10     public Person(String name, Integer age, Date date) {
11         this.name = name;
12         this.age = age;
13         this.date = date;
14     }
15     public String getName() {
16         return name;
17     }
18     public void setName(String name) {
19         this.name = name;
20     }
21     public Integer getAge() {
22         return age;
23     }
24     public void setAge(Integer age) {
25         this.age = age;
26     }
27     public Date getDate() {
28         return date;
29     }
30     public void setDate(Date date) {
31         this.date = date;
32     }
33     public Person() {
34     }
35     @Override
36     public String toString() {
37         return "Person [name=" + name + ", age=" + age + ", date=" + date + "]";
38     }
39 }

  2.核心类:

    (1)PropertyDescriptor类。

        [1]继承关系

            java.lang.Object

              |--java.beans.FeatureDescriptor

                |--java.beans.PropertyDescriptor

        [2]构造方法


构造方法摘要


PropertyDescriptor(String propertyName, Class<?> beanClass)
          通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。

 

PropertyDescriptor(String propertyName, Class<?> beanClass,
String readMethodName, String writeMethodName)

          此构造方法带有一个简单属性的名称和用于读写属性的方法名称。

 

PropertyDescriptor(String propertyName, Method readMethod,
Method writeMethod)

          此构造方法带有某一简单属性的名称,以及用来读取和写入属性的
Method 对象。

 

        [3]核心方法


 Class<?>


getPropertyType()
          获得属性的 Class 对象。


 Method


getReadMethod()
          获得应该用于读取属性值的方法。


 Method


getWriteMethod()
          获得应该用于写入属性值的方法。


void


setReadMethod(Method readMethod)
          
设置应该用于读取属性值的方法。


 void


setWriteMethod(Method writeMethod)
          
设置应该用于写入属性值的方法。

       [4]使用示例。

          获的setName方法并给Person对象赋值。

public void test1() throws Exception
    {
        Person p=new Person();
        /*
         //这里是通过普通的反射方法来实现的。
                Method method=p.getClass().getMethod("setName", String.class);
                method.invoke(p, "张三");
                System.out.println(p);
        */
        //下面通过使用内省的方式来实现该目的。
        PropertyDescriptor pd=new PropertyDescriptor("name", p.getClass(),"getName","setName");
        Method getName=pd.getReadMethod();
        String name=(String) getName.invoke(p);
        System.out.println(name);

        Method setName=pd.getWriteMethod();
        setName.invoke(p, "小强");
        getName=pd.getReadMethod();
        System.out.println(getName.invoke(p));
        /*
         * 输出结果:
         * null
         * 小强
         */
    }

        不能进行类型的自动转换。

public void test2() throws Exception
    {
        Person p=new Person();
        PropertyDescriptor pd=new PropertyDescriptor("age", p.getClass());
        Method setAge=pd.getWriteMethod();
        setAge.invoke(p, "12");//这里只能传递整数类型的参数,所以一定会报错!
        System.out.println(p);
    }

    (2)BeanInfo接口:专门分析一个JavaBean有多少属性,有哪些属性

      [1]获取该接口实例的方法

        使用Introspector(内省)类(   java.lang.Object   )的静态方法:getBeanInfo(Class<?> beanClass)

                        |--java.bean.Introspector


static BeanInfo


getBeanInfo(Class<?> beanClass)
          在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。

      [2]核心方法:getPropertygetDescriptors方法。 


PropertyDescriptor[]


getPropertyDescriptors()
          获得 beans PropertyDescriptor。

      [3]使用方法。

/*
     * 测试非常不好的类:BeanInfo类,该类并不会将一个Bean对象的所有属性都能解析成功,反而是只要是
     * get或者set方法都会
     * 解析出来。
     * 所以即使是getClass方法该类也会将其作为class属性解析出来。
     * 如果不成对,也会解析出来。
     */
    @Test
    public void test3() throws Exception
    {
        BeanInfo beaninfo=Introspector.getBeanInfo(Person.class);
        PropertyDescriptor pd[]=beaninfo.getPropertyDescriptors();
        for(int i=0;i<pd.length;i++)
        {
            String name=pd[i].getName();
            System.out.println(name);
        }
    }
    

  3.解决类型不匹配的方法:遍历判断

    (1)场景:Person类有age成员变量,为int类型,如果想要传递一个字符串给它,一般情况下会报错:不匹配的参数类型。怎样解决这个问题呢?对set方法能接受的参数类型进行判断,如果是整型参数才传递。

    (2)手动遍历解决。

/*
     * 怎样实现将字符串传递到setAge方法中
     * 通过使用便利的方式依次对set方法进行遍历
     * 这里的JavaBean必须是Integer类型的,否则不识别。
     * 这么麻烦的工作apache已经将其简化开发出了第三方jar包:BeanUtils.jar
     */
    @Test
    public void test4() throws Exception, IllegalArgumentException, IllegalAccessException, InvocationTargetException
    {
        String name="小强";
        String age="30";
        Person p=new Person();
        Method methods[]=p.getClass().getDeclaredMethods();
        for(Method method:methods)
        {
            String methodname=method.getName();
            //如果是set方法才行进下一步,get方法直接跳过
            if(methodname.startsWith("set"))
            {
                Class<?> clazz[]=method.getParameterTypes();
                System.out.println(clazz[0]);
                if(clazz[0].equals(String.class))
                {
                    method.invoke(p,name);
                }
                else if(clazz[0].equals(Integer.class))
                {
                    method.invoke(p, Integer.parseInt(age));
                }
            }
            else
                continue;
        }
        System.out.println(p);
    }

  4.使用第三方jar包:BeanUtils.jar解决 3  中的问题以及使用第三方jar包的好处。

  BeanUtils.jar下载地址:http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi

  依赖包:commons-logging.jar包

    (1)BeanUtils.jar是干什么用的?

       是一个处理JavaBean的工具包,内部也是使用内省,但是对内省进行了加强。

    (2)使用该工具包的好处是什么?

       JavaBean中的get方法和set方法不用再成对出现。

       能够自动进行基本数据类型的转换(不是基本数据类型不能自动进行转换)。

    (3)演示使用BeanUtils设置值。

//演示使用BeanUtils设置值
    @Test
    public void setValueTest() throws Exception, Exception
    {
        Person p=new Person();
        BeanUtils.setProperty(p,"name", "小强");
        BeanUtils.setProperty(p, "age", "45");
        BeanUtils.setProperty(p, "date", new Date());
        System.out.println(p);
    }

    (4)演示使用BeanUtils获取值。

//演示使用BeanUtils获取值。
    @Test
    public void getValueTest() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    {
        Person p=new Person("小强",24,new Date());
        System.out.println(BeanUtils.getProperty(p, "name"));
        System.out.println(BeanUtils.getProperty(p, "age"));
        System.out.println(BeanUtils.getProperty(p, "date"));
    }

    (5)使用BeanUtils一次性将获取到的值封装到javaBean中。

//使用Benutils一次性填入所有值的方法
    @Test
    public void  setValueAll() throws Exception, InvocationTargetException
    {
        Person p=new Person();
        Map<String,Object>map=new HashMap<String,Object>();
        map.put("name", "小强");
        map.put("age", "24");
        map.put("date", new Date());
        BeanUtils.populate(p, map);            //这句是关键
        System.out.println(p);

        //这种方式在分析表单提交的数据并封装成JavaBean的时候使用的非常广泛,因为可以大大节省代码量,注意要使用request对象的getParameterMap()方法。
    }
时间: 2024-10-14 07:10:21

【Java EE 学习第23天】【log4j的使用】【ant的使用】【内省】的相关文章

【Java EE 学习第16天】【dbcp数据库连接池】【c3p0数据库连接池】

零.回顾之前使用的动态代理的方式实现的数据库连接池: 代码: 1 package day16.utils; 2 3 import java.io.IOException; 4 import java.lang.reflect.InvocationHandler; 5 import java.lang.reflect.Method; 6 import java.lang.reflect.Proxy; 7 import java.sql.Connection; 8 import java.sql.D

Java EE学习--Quartz基本用法

新浪博客完全不适合写技术类文章.本来是想找一个技术性的博客发发自己最近学的东西,发现博客园起源于咱江苏,一个非常质朴的网站,行,咱要养成好习惯,以后没事多总结总结经验吧.很多时候都在网上搜索别人的总结,我自己也总结些东西,或许多多少少能帮得上别人. 首先提到的是Quartz,一个开源的定期执行计划任务的框架.其实我内心好奇这个框架很久了,像那些能定时修改数据库数据,定时分配任务的功能一直觉得很神奇.心动不如行动,今天我就小小的学习了一下用法,力求言简意赅,大家都懂的我就不说了. 第一步:下载Qu

Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库

参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Java EE 学习(6):IDEA + maven + spring 搭建 web(2) 5 数据库配置 下面,就要通过一个简单的例子,来介绍 SpringMVC 如何集成 Spring Data JPA(由 Hibernate JPA 提供),来进行强大的数据库访问,并通过本章节

JAVA EE 学习笔记[V1 jsp编程]

在三月初学校开设了javaee的课程,也就此展开了对javaee基础的学习.然后老师也对这次的课程有一定要求.前面的基础就为最终的作业做准备啦~ 在上学期我们学习了java相关知识,也对java se 的安装使用有了一定的认知,而java ee则是构建于java se 平台之上的一套多层的,可扩展的的网络应用. 学习java ee我们首先进行环境的搭建.无非就是使用 tomcat进行服务器的搭建和jdk环境变量配置.而IDE这方面我们选择myeclipse 2016 CI(这个编译器自带tomc

Java EE 学习(5):IDEA + maven + spring 搭建 web(1)

参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html http://www.ctolib.com/docs-IntelliJ-IDEA-c--159047.html 孔老师的<SpringMVC视频教程> 记录: 本节主要完成 使用 maven 管理 spring + 项目 包,搭建 maven+spring 的 web 项目平台. 前提: 已安装并配置好 - Intellij IDEA 16.3.5 Ultimate - JDK 1.8.0_

Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理

转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库 记录: 通过对用户表的管理,更加深入地讲解SpringMVC的操作. 6 用户管理 既然我们

Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理

转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库 Java EE 学习(8):IDEA + maven + spring 搭建 web(

Java EE学习之旅1——HeadFirstJavaEE

因为找到的实习是用Java开发的公司,所以来学习一下Java EE的知识. 首先找来了书<轻量级Java EE企业应用实战>. 啊不得不说学了Java之后直接看这个还是完全不行呢,好多名词看都没有看过啊哈哈. 首先来看看都些啥看不懂的词... 1.JSP.Servlet和JavaBean JSP和Servlet都是用在表现层的东西,而实质上JSP编译成Servlet才运行. 但Servlet开发成本太大,所以用JSP. JavaBean用来通信交换表现层和底层数据. 2.MVC和Struts

Java EE学习——Quartz的Cron表达式

经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比如我们想设定淘宝“秒杀”的那一秒时间,完全可以用下面的方法设置执行时间. Calendar cal = Calendar.getInstance(); //设置将要发生的时间... cal.set(Calendar.DATE, xxx); //.......常规的生成scheduler和job //