【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实际上就是依据某些标准, ...
 
随机推荐
- 移动端meta
			
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scal ...
 - 6种php发送get、post请求的方法简明归纳与示例
			
方法1: 用file_get_contents 以get方式获取内容: <?php $url='http://www.jb51.net/'; $html = file_get_contents( ...
 - 网络基础之IPv4、网线、
			
=========================================Internet是一个圈子,进去这个圈子就要有相应的身份,就像我们去篮球场打球,首先得是个"人"才 ...
 - light
			
Unity5中lightmap的坑 http://blog.csdn.net/langresser_king/article/details/48914901 Unity中光照贴图一二坑及解决办法 h ...
 - Unicode文件读取 出现隐藏字符 (大坑)
			
C#读取文件..分析时发现应该15位的.. str.Lenght 却 16位.. 字符串复制出来一位位的数..就是15位.. 纳闷中突然想起来会不会是隐藏字符.. 输出 str[0].ToBytes( ...
 - css之图片路径
			
关于背景图片url路径:图片和调用文件在两个不同根下的(不在同一个包(文件夹)中),要用相对路径,举例"../images/cq.gif":图片和调用文件是在一个根下的直接孩子,用 ...
 - mysql安装配置
			
MySQL 是最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言. MySQL由于其体积小.速度快 ...
 - Programming with Objective-C ----------Encapsulating Data
			
Most Properties Are Backed by Instance Variables By default, a readwrite property will be backed by ...
 - PHP如何判断一个gif图片是否为动画?
			
首先想到的是用getimagesize()看看type,发现都是gif. 然后想gif动画是gif89格式的,发现文件开头是gif89,但是很多透明图片也是用的gif89格式. 看来必须分析文件的祯了 ...
 - PHP 的异常处理、错误处理:error_reporting,try-catch,trigger_error,set_error_handler,set_exception_handler,register_shutdown_function
			
一.错误.异常 等级常量表 error:不能在编译期发现的运行期错误,比如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断: exception:程序执行过程中 ...