第02天 java基础加强

今日内容介绍

u Properties的基本操作

u 反射综合案例

u BeanUtils概述及使用

第1章   Properties的基本操作

1.1  Properties的概述及基本使用

1.1.1 Properties的概述

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

特点:

1、Map接口的子类,map中的方法都可以用。

2、该集合没有泛型。键值都是字符串。

3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。

4、有和流技术相结合的方法。

1.2  常用方法

l  public Object setProperty(String key, String value)调用 Map 的方法 put。

l  public Set<String> stringPropertyNames()返回此属性列表中的键集,

l  public String getProperty(String key)用指定的键在此属性列表中搜索属性

1.2.1 案例代码一

public class PropsDemo_01 {

@Test

public void demo01(){

//Properties对象 特殊Map<String,String>

//1 创建对象

Properties props = new Properties();

//2 设置数据

//props.put(key, value)

props.setProperty("k01", "v01");

props.setProperty("k02", "v02");

props.setProperty("k03", "v03");

//3 获得指定名称的数据

String prop = props.getProperty("k02");

System.out.println(prop);

//4获得所有名称,并遍历获得所有的数据

System.out.println("--------------");

Set<String> names = props.stringPropertyNames();

for(String name : names){

String value = props.getProperty(name);

System.out.println(name + " : " + value);

}

}

}

1.3  Properties加载文件写入文件

1.3.1 将集合中内容存储到文件

l  store(OutputStream,commonts)

l  stroe(Writer,comments);

把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息

1.3.2 案例代码二

@Test

public void demo01() throws Exception{

//将内容写入到文件

// * Properties 对应一种特殊文件:*.properties

// * 一行表示一个键值对,格式:k=v

//1 创建对象

Properties props = new Properties();

//2 设置数据

//props.put(key, value)

props.setProperty("k01", "v01黑马");

props.setProperty("k02", "v02程序员");

props.setProperty("k03", "v03");

//3 将props写入到硬盘

Writer writer = new OutputStreamWriter(new FileOutputStream("1.properties"),"UTF-8");

props.store(writer, "描述");

writer.close();

}

1.3.3 读取文件中的数据,并保存到集合

l  load(InputStream)

l  load(Reader)

把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中

1.3.4 案例代码三

@Test

public void demo02() throws Exception{

//从properties文件中获得数据

//1 获得资源流

Reader reader = new InputStreamReader(new FileInputStream("1.properties"),"UTF-8");

//2 通过Properties对象加载流

Properties props = new Properties();

props.load(reader);

//3 遍历所有

for(String name : props.stringPropertyNames()){

String value = props.getProperty(name);

System.out.println(name + " @ " +  value);

}

}

第2章   反射综合案例

2.1  需求分析

将javaBean的数据以配置文件的方式写进properties中,读取配置文件写进BeanConfig进行封装,在测试类中去读BeanConfig中封装的数据,并以反射的方式根据读取的数据创建对象,给对象的属性设置值。
反射的好处:我们不用将数据写死到java代码中,可以使用配置文件将数据写入配置文件中。提高了代码的灵活性。

2.2     
案例代码四

2.2.1 首先编写JavaBean

User

package com.itheima_02_demo.bean;

public class User {

private String uid;

private String username;

private String password;

public String getUid() {

return uid;

}

public void
setUid(String uid) {

this.uid = uid;

}

public String getUsername() {

return username;

}

public void
setUsername(String username) {

this.username
= username;

}

public String getPassword() {

return password;

}

public void
setPassword(String password) {

this.password
= password;

}

@Override

public String toString() {

return "User
[uid=" + uid + ", username=" + username
+ ", password=" + password + "]";

}

}

 

Book

package com.itheima_02_demo.bean;

public class Book {

private String bid;

private String title;

private String price;

public String getBid() {

return bid;

}

public void
setBid(String bid) {

this.bid = bid;

}

public String getTitle() {

return title;

}

public void
setTitle(String title) {

this.title
= title;

}

public String getPrice() {

return price;

}

public void
setPrice(String price) {

this.price
= price;

}

@Override

public String toString() {

return "Book
[bid=" + bid + ", title=" + title
+ ", price=" + price + "]";

}

}

2.2.2 创建配置文件

bean.properties

id=id001

className=com.itheima.domain.User

data.properties

uid=u001

userName=jack

password=1234

2.2.3 编写BeanConfig类

目的: 封装2个Properties文件中的内容

import java.util.Properties;

public class BeanConfig {

private String id;

private String className;

private Properties props
= new Properties();

public String getId() {

return id;

}

public void
setId(String id) {

this.id = id;

}

public String getClassName() {

return className;

}

public void
setClassName(String className) {

this.className
= className;

}

public Properties getProps() {

return props;

}

public void
setProps(Properties props) {

this.props
= props;

}

@Override

public String toString() {

return "BeanConfig
[id=" + id + ", className=" + className + ", props="
+ props + "]";

}

}

2.2.4 解析Properties

public class Demo_02 {

@Test

public void demo01() throws Exception{

//读取配置文件,获得具体信息

BeanConfig beanConfig = new BeanConfig();

//1 读取bean.properties文件,设置id和className属性

Properties beanProps = new Properties();

beanProps.load(new InputStreamReader(new FileInputStream("bean.properties"), "UTF-8"));

beanConfig.setId(beanProps.getProperty("id"));

beanConfig.setClassName(beanProps.getProperty("className"));

//2读取data.properties文件,设置getProps().setProperty()

Properties dataProps = new Properties();

dataProps.load(new InputStreamReader(new FileInputStream("data.properties"), "UTF-8"));

for(String name : dataProps.stringPropertyNames()){

String value = dataProps.getProperty(name);

beanConfig.getProps().setProperty(name, value);

}

System.out.println(beanConfig);

}

}

2.2.5 使用BeanConfig数据

import java.lang.reflect.Method;

import org.junit.Test;

import com.itheima.domain.BeanConfig;

public class Demo_03 {

@Test

public void
demo01() throws Exception{

//模拟数据

BeanConfig
beanConfig = new
BeanConfig();

beanConfig.setId("id001");

beanConfig.setClassName("com.itheima.domain.User");

beanConfig.getProps().setProperty("uid", "u001");

beanConfig.getProps().setProperty("userName", "jack");

beanConfig.getProps().setProperty("password", "1234");

//使用数据创建JavaBean实例,并为JavaBean封装具体数据

//1 创建实例,使用反射

Class
clazz = Class.forName(beanConfig.getClassName());

Object
obj = clazz.newInstance();

//2 调用JavaBean的setter方法进行数据封装

for(String name
: beanConfig.getProps().stringPropertyNames()){

String
value = beanConfig.getProps().getProperty(name);

// 获得方法名称 : set前缀 + 大写首字母
+ 其他内容

String
methodName = "set"
+ name.substring(0, 1).toUpperCase() + name.substring(1);

// 调用setter方法

Method
method = clazz.getMethod(methodName, String.class);

method.invoke(obj,
value);

}

System.out.println(obj);

}

}

2.2.6 综合案例整合

import java.io.FileInputStream;

import java.io.InputStreamReader;

import java.lang.reflect.Method;

import java.util.Properties;

import org.junit.Test;

import com.itheima.domain.BeanConfig;

public class Demo_04 {

//获得配置文件具体数据

public BeanConfig getBean() throws Exception{

//读取配置文件,获得具体信息

BeanConfig
beanConfig = new
BeanConfig();

//1 读取bean.properties文件,设置id和className属性

Properties
beanProps = new
Properties();

beanProps.load(new
InputStreamReader(new
FileInputStream("bean.properties"),
"UTF-8"));

beanConfig.setId(beanProps.getProperty("id"));

beanConfig.setClassName(beanProps.getProperty("className"));

//2读取data.properties文件,设置getProps().setProperty()

Properties
dataProps = new
Properties();

dataProps.load(new
InputStreamReader(new
FileInputStream("data.properties"),
"UTF-8"));

for(String name
: dataProps.stringPropertyNames()){

String
value = dataProps.getProperty(name);

beanConfig.getProps().setProperty(name, value);

}

return beanConfig;

}

@Test

public void
demo01() throws Exception{

//真实具体数据

BeanConfig
beanConfig = getBean();

//使用数据创建JavaBean实例,并为JavaBean封装具体数据

//1 创建实例,使用反射

Class
clazz = Class.forName(beanConfig.getClassName());

Object
obj = clazz.newInstance();

//2 调用JavaBean的setter方法进行数据封装

for(String name
: beanConfig.getProps().stringPropertyNames()){

String
value = beanConfig.getProps().getProperty(name);

// 获得方法名称 : set前缀 + 大写首字母
+ 其他内容

String
methodName = "set"
+ name.substring(0, 1).toUpperCase() + name.substring(1);

// 调用setter方法

Method
method = clazz.getMethod(methodName, String.class);

method.invoke(obj,
value);

}

System.out.println(obj);

}

}

第3章  
BeanUtils的概述及使用

3.1  BeanUtils的概述和简单使用

3.1.1 BeanUtils概述

BeanUtils 是 Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作。它可以给JavaBean封装一个字符串数据,也可以将一个表单提交的所有数据封装到JavaBean中。

3.1.2 需要的jar包

BeanUtils工具常用工具类有两个:BeanUtils、ConvertUtils[WU1] 。BeanUtils用于封装数据,ConvertUtils用于处理类型转换

常用方法:

setProperty(Object obj,String name,Object
value)

设置属性值,如果指定属性不存在,不抛异常

getProperty(Object obj,String name)

获得属性值,如果指定属性不存在,抛方法找不到异常

3.1.3 案例代码五

使用BeanUtils把数据封装进User对象

import org.apache.commons.beanutils.BeanUtils;

import org.junit.Test;

import com.itheima_01_bean.User;

public class BeanUtilsDemo_01 {

@Test

public void
demo01(){

//模拟向User对象封装数据

User user = new
User();

user.setUid("u001");

user.setUserName("jack");

user.setPassword("1234");

System.out.println(user);

}

@Test

public void
demo02() throws Exception{

/* 实际开发中,需要封装到JavaBean中的数据存放在配置文件

* * 内容:uid=u001 、userName=jack

*

* JavaBean中两个概念:字段Field、属性Property

* * 字段:就是成员变量。

*      例如:private String
userName;

*      字段名称:userName

* * 属性:通过getter或setter方法推敲获得

*      获得方式:省略set或get前缀,首字母小写

*      例如:getUserName  --> UserName  --> userName

* * 注意:一般情况下,字段名称和属性名称一致的。

*

* * 特殊情况

*      private String description;     //字段名:description

*      public String getDesc(){        //属性名:desc

*          return description;

*      }

*/

//1 BeanUtils工具类,提供setProperty 给指定属性设置内容  和 getProperty获得指定属性的值

User user = new
User();

System.out.println("封装前:" + user);

// * 封装数据来自配置文件 , 底层其实  user.setUid("u002")

BeanUtils.setProperty(user, "uid",
"u002");

BeanUtils.setProperty(user, "userName",
"rose");

System.out.println("封装后:" + user);

//2 获得属性值

String
userName = BeanUtils.getProperty(user, "userName");

System.out.println(userName);

}

}

User

import java.util.Arrays;

public class User {

private String uid;

private String userName;

private String password;

private String[] hobbies;       //爱好

private int
age;

public String getUid() {

return uid;

}

public void
setUid(String uid) {

this.uid = uid;

}

public String getUserName() {

return userName;

}

public void
setUserName(String userName) {

this.userName
= userName;

}

public String getPassword() {

return password;

}

public void
setPassword(String password) {

this.password
= password;

}

public String[] getHobbies() {

return hobbies;

}

public void
setHobbies(String[] hobbies) {

this.hobbies
= hobbies;

}

public int
getAge() {

return age;

}

public void
setAge(int age)
{

this.age = age;

}

@Override

public String toString() {

return "User
[uid=" + uid + ", userName=" + userName
+ ", password=" + password + ",
hobbies="

+
Arrays.toString(hobbies) + ", age=" + age
+ "]";

}

}

3.2  BeanUtils的populate方法的使用

3.2.1 方法说明

BeanUtils对象    populate(Object bean, Map<String,String[]>
properties)    将Map数据封装到指定Javabean中,一般用于将表单的所有数据封装到javabean。

3.2.2 案例代码六

使用populate方法将数据封装到User对象中

import java.util.HashMap;

import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

import org.junit.Test;

import com.itheima_01_bean.User;

public class BeanUtilsDemo_02 {

@Test

public void
demo01() throws Exception{

//1.模拟数据,创建一个Map,填充需要的数据

Map<String,String[]>
map = new
HashMap<String,String[]>();

map.put("uid",
new String[]{"u001"});

map.put("userName",
new String[]{"jack","rose"});

map.put("password",
new String[]{"1234"});

//2 将使用populate进行填充

User user = new
User();

BeanUtils.populate(user, map);

System.out.println(user);

}

@Test

public void
demo02() throws Exception{

//1.模拟数据,创建一个Map,填充需要的数据

Map<String,String[]>
map = new
HashMap<String,String[]>();

map.put("uid",
new String[]{"u001"});

map.put("userName",
new String[]{"jack","rose"});

map.put("password",
new String[]{"1234"});

map.put("hobbies",
new String[]{"敲代码","早上敲代码","晚上敲代码"});

map.put("age",
new String[]{"123"});

//2 将使用populate进行填充

// * 可以向指定的属性,填充一组数据。需要类型必须是[]

// * 如果属性不是数组,将使用map.value表示数组中的第一个。

// * BeanUtils支持类型:基本类型 和 基本类型对应的包装类 。自动将字符串转换基本类型

User user = new
User();

BeanUtils.populate(user, map);

System.out.println(user);

}

}

3.3      BeanUtils自定义工具类

3.3.1 自定义工具类的基本使用

3.3.2 案例代码七

1.定义静态的一个工具类,定义方法populate,参数为Object 和 Map<String,String[]>

返回值类型为void

import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

public class MyBeanUtils {

/**

* 自动填充

* @param bean

* @param properties

*/

public static
void populate(Object bean , Map<String,String[]> properties ){

try {

BeanUtils.populate(bean, properties);

} catch (Exception e)
{

//将编译时异常,转换成运行时,方便调用者(使用者不需要再次处理异常)

throw new
RuntimeException(e);

}

}

}

测试代码

@Test

public void demo01() {

//1.模拟数据,创建一个Map,填充需要的数据

Map<String,String[]> map = new HashMap<String,String[]>();

map.put("uid", new String[]{"u001"});

map.put("userName", new String[]{"jack","rose"});

map.put("password", new String[]{"1234"});

//2 将使用populate进行填充

User user = new User();

MyBeanUtils.populate(user, map);

System.out.println(user);

}

 

2.定义静态的一个工具类,定义方法populate,参数为Class 和 Map<String,String[]>

返回值类型为Object

/**

* 自动填充

* @param
bean

* @param
properties

*/

public static Object populate(Class beanClass , Map<String,String[]> properties ){

try {

//1 使用反射进行实例化

Object bean = beanClass.newInstance();

//2 填充数据

BeanUtils.populate(bean, properties);

//3 将填充好JavaBean实例返回

return bean;

} catch (Exception e) {

//将编译时异常,转换成运行时,方便调用者(使用者不需要再次处理异常)

throw new RuntimeException(e);

}

}

}

3.3.3 带泛型的自定义工具类

3.3.4 代码案例八

1.定义静态的一个工具类,定义方法populate,参数为Class<T>和 Map<String,String[]>

返回值类型为T

public class MyBeanUtils3 {

/**

* 自动填充

* @param bean

* @param properties

*

* Class<T> 此处的T就是一个变量,在运行时,接收具体类型。例如:User

* 变量必须先定义在使用

*      泛型变量的定义方式:修饰符 <变量名> 返回值

*/

public static
<T> T populate(Class<T> beanClass
, Map<String,String[]> properties ){

try {

//1 使用反射进行实例化

T
bean = beanClass.newInstance();

//2 填充数据

BeanUtils.populate(bean, properties);

//3 将填充好JavaBean实例返回

return bean;

} catch (Exception e)
{

//将编译时异常,转换成运行时,方便调用者(使用者不需要再次处理异常)

throw new
RuntimeException(e);

}

}

}

2.测试类

@Test

public void demo03() throws
Exception{

//工具类使用

Map<String,String[]> properties = new HashMap<String,String[]>();

properties.put("id", new String[]{"18"});

properties.put("username", new String[]{"jack"});

properties.put("pwd", new String[]{"1234"});

User obj = MyBeanUtils.populate2(User.class, properties);

System.out.println(obj);

/* 结果:

* User [id=18, username=jack, pwd=1234]

*/

}


[WU1]

已经删除

java基础-day25的更多相关文章

  1. Java基础系列--HashMap(JDK1.8)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...

  2. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  3. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  4. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  5. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  6. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  7. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  8. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  9. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

随机推荐

  1. JavaScript 练习题

    练习题 1. 使用for循环输出1到50的值,要求每次循环只能输出一个值,每输出十个换一行. 2 日历生成器: 要求 用户输入,这个月有多少天,本月1号是星期几,自动生成日历 3. 表格生成器 4.  ...

  2. 关于PHP程序员技术职业生涯规划 2017年3月5日韩 天峰

    看到很多PHP程序员职业规划的文章,都是直接上来就提Linux.PHP.MySQL.Nginx.Redis.Memcache.jQuery这些,然后就直接上手搭环境.做项目,中级就是学习各种PHP框架 ...

  3. 使用java5的注解和Sping/AspectJ的AOP 来实现Memcached的缓存

    使用java5的注解和Sping/AspectJ的AOP 来实现Memcached的缓存 今天要介绍的是Simple-Spring-Memcached,它封装了对MemCached的调用,使MemCa ...

  4. m0n0wall 详细介绍

    pfSense就是基于m0n0wall m0n0wall,挺奇怪的软件名, M0n0wall是基于以性能和稳定性著称的FreeBSD内核的嵌入式的防火墙系统. m0n0wall对硬件要求很低,486芯 ...

  5. Nowcoder OI赛制测试2 F 假的数学题 - 斯特林公式 + 二分

    Description 给定$X$, 找到最小的$N$ 使得$N! > X^X$ 数据范围:  $x <= 1e11$ Solution $X^X$ 太大, 高精也存不过, 所以取对数 : ...

  6. c++文件中引用C代码

    下面提供一个比较完整的示例程序,一共有四个文件:main.cpp.test.c.test.h.test.hpp main.cpp #include "test.hpp" int m ...

  7. Clover相关知识

    -f 重建驱动缓存 darkwake=4 有深度睡眠有关的设置,不懂 kext-dev-mode=1 启用第三方驱动,比较重要. dart=0 修复因开启 VT-d 导致系统启动时SMC五国错误,系统 ...

  8. 算法题思路总结和leecode继续历程

    2018-05-03 刷了牛客网的题目:总结思路(总的思路跟数学一样就是化简和转化) 具体启发点: 1.对数据进行预处理排序的思想:比如8皇后问题 2.对一个数组元素进行比较的操作,如果复杂,可以试试 ...

  9. Java环境编写

    首先安装jdk,本系统中jdk安装在D:\jdk:jre安装在D:\Jre: 然后开始配置环境变量: JAVA_HOME:D:\jdk; JRE_HOME:D:\jre; CLASSPATH:.;%J ...

  10. OneZero第三周第一次站立会议(2016.4.4)

    1. 时间: 13:30--13:45  共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...