【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
package com.kdyzm.domain;
import java.util.Date;
public class Person {
private String name;
private Integer age;
private Date date;
public Person(String name, Integer age, Date date) {
this.name = name;
this.age = age;
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Person() {
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", date=" + date + "]";
}
}
2.核心类:
(1)PropertyDescriptor类。
[1]继承关系
java.lang.Object
|--java.beans.FeatureDescriptor
|--java.beans.PropertyDescriptor
[2]构造方法
|
构造方法摘要 |
|
|
|
|
|
|
|
|
|
|
[3]核心方法
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[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) |
[2]核心方法:getPropertygetDescriptors方法。
|
getPropertyDescriptors() |
[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
(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()方法。
}
【Java EE 学习 23】【log4j的使用】【ant的使用】【内省】的更多相关文章
- Java EE学习——Quartz的Cron表达式
经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比 ...
- Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理
转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Jav ...
- Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理
转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava E ...
- Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库
参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 ...
- Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring
参考:https://my.oschina.net/gaussik/blog/513353 注:此文承接上一文:Java EE 学习(5):IDEA + maven + spring 搭建 web(1 ...
- Java EE 学习(5):IDEA + maven + spring 搭建 web(1)
参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html http://www.ctolib.com/docs-IntelliJ-IDEA-c--1590 ...
- Java EE 学习(4):IDEA + maven 搭建 web(2)
参考:http://www.bubuko.com/infodetail-1855067.html 现使用 Maven 创建项目:本节接Java EE 学习(3):IDEA + maven 搭建 web ...
- 【Java EE 学习 69 中】【数据采集系统第一天】【SSH框架搭建】
经过23天的艰苦斗争,终于搞定了数据采集系统~徐培成老师很厉害啊,明明只是用了10天就搞定的项目我却做了23天,还是模仿的...呵呵,算了,总之最后总算是完成了,现在该好好整理该项目了. 第一天的内容 ...
- 【Java EE 学习 80 上】【WebService】
一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...
随机推荐
- git-添加公钥
安装完git后,打开开git bush 输入以下命令 git config --global user.name "Your Name" git config --global u ...
- shell浅谈之十函数
转自:http://blog.csdn.net/taiyang1987912/article/details/39583179 一.简介 Linux Shell编 程中也会使用到函数,函数可以把大的命 ...
- 【USACO 2.3】Controlling Companies (递推)
题意:A公司对B公司有控制权的条件是满足下面条件之一:A=B,A对B的股份超过50%,A控制的公司对B的股份之和超过50%. 分析:我把控制关系分个等级:第一级是直接的股份超过50%,第二级是至少需要 ...
- 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- Map工具系列-04-SQL合并执行工具
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- BZOJ3209 花神的数论题
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- Python基本数据类型之整型和布尔型
整型和布尔型 获取对象的数据类型 1.type() 2.dir() 3.help() 4.在pycharm里面的操作 数字类型 int 创建: int() 接收数字字符串 .bit_lenght() ...
- jedis池的作用
一.jedis池的介绍 相信大家都用过线程池或者是jdbc的连接池,使用池可以减少系统在使用所需对象时创建对象的开销,从而提高系统性能和效率.jedis池也是如此,那么我们该如何使用jedis池呢? ...
- Google Map API V3开发(3)
Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...
- thinkphp 3.2与phpexcel
thinkphp版本:3.2 1.在http://phpexcel.codeplex.com/下载最新PHPExcel 2.把Classes目录下的文件(PHPExcel.php和PHPExcel文件 ...