我们一路奋战,不是为了改变世界,而是为了不让世界改变我们。


  • 运行环境

   JDK8 + IntelliJ IDEA 2018.3

  • 本文中使用的jar包链接

https://files.cnblogs.com/files/papercy/jsoup_jar%E5%8C%85.rar
  • JAVA Bean

1、了解JAVA Bean:

  JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

  如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。

2、Java Bean 的属性

JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。

setId()的属性名àid

isLast()的属性名àlast

setCPU的属性名: CPU

getUPS的属性名: UPS

  总之,一个类被当作JavaBean使用时类,JavaBean的属性是根据方法名推断出来的,它根本看不到java内部的成员变量。

3、使用Java Bean 的好处
  • 在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作。

  • JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过get X方法来访问私有的x,怎么做,有一定难度吧?用内省这套API操作JavaBean比用普通类的方式更方便

  • 自动生成Reflect Point类的setter和getter方法

 public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
ReflectPoint pt1 = new ReflectPoint(3,5);
Object retVal = getProperty(pt1);
System.out.println(retVal); PropertyDescriptor pd2 = null;
String propertyName = "y";
Object value = 7;
setProperty(pt1, propertyName, value); //先通过调用普通java类的方法的方式获得结果,然后在这之前插入BeanUtil的get和set操作,见下面的代码。
//System.out.println(pt1.getY()); System.out.println(BeanUtils.getProperty(pt1, "y"));
BeanUtils.setProperty(pt1, "y", "99"); System.out.println(pt1.getY());
PropertyUtils.setProperty(pt1, "y", 999);
System.out.println(PropertyUtils.getProperty(pt1, "y").getClass().getName());
} private static Object getProperty(ReflectPoint pt1) {
Object retVal = null;
PropertyDescriptor pd = null;
try {
pd = new PropertyDescriptor("y",pt1.getClass());
retVal = pd.getReadMethod().invoke(pt1);
} catch (Exception e) {
e.printStackTrace();
}
return retVal;
} private static void setProperty(Object pt1, String propertyName,
Object value) {
/*PropertyDescriptor pd2;
try {
pd2 = new PropertyDescriptor(propertyName,pt1.getClass());
pd2.getWriteMethod().invoke(pt1,value);
} catch (Exception e) {
e.printStackTrace();
}*/ try {
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd :pds){
if(pd.getName().equals(propertyName)){
pd.getWriteMethod().invoke(pt1,value);
break;
}
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
  • Beanutils工具包

    1. 演示用eclipse如何加入jar包,先只是引入beanutils包,等程序运行出错后再引入logging包。
    2. 在前面内省例子的基础上,用BeanUtils类先get原来设置好的属性,再将其set为一个新值。
    3. 用PropertyUtils类先get原来设置好的属性,再将其set为一个新值。
 	public static void main(String[] args) {
// TODO Auto-generated method stub
/*System.out.println(
PropertyUtils.getProperty(Sex.NONE, "title"));*/ Object bean = Sex.NONE;
BeanInfo beanInfo = null;
try {
beanInfo = Introspector.getBeanInfo(bean.getClass());
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} PropertyDescriptor[] properties = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor property:properties)
{
if(property.getName().equals("title"))
{
Method method = property.getReadMethod();
method.setAccessible(true);
Object retVal;
try {
retVal = method.invoke(bean, null);
System.out.println(retVal);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
}

注意: get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串. get属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型。

  • 代码演示

Demo1

 package com.wenhaitao.Ekt3.Demo1;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method; public class Demo1 {
public static void main(String[] args) {
User user = new User();
PropertyDescriptor pd_name = null;
try {
pd_name = new PropertyDescriptor("uname", User.class);
Method method_setName = pd_name.getWriteMethod();
method_setName.invoke(user, "肥肥也");
PropertyDescriptor pd_pass = new PropertyDescriptor("upass", User.class);
Method method_setpass = pd_pass.getWriteMethod();
method_setpass.invoke(user, "54920");
System.out.println(user); Method method_getname = pd_name.getReadMethod();
System.out.println(method_getname.invoke(user));
Method method_getpass = pd_pass.getReadMethod();
System.out.println(method_getpass.invoke(user)); // 遍历所有的属性
BeanInfo info = Introspector.getBeanInfo(User.class);
PropertyDescriptor[] pds = info.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
System.out.println("属性名:" + pd.getName());
System.out.println("属性类型:" + pd.getPropertyType());
}
} catch (Exception e) {
e.printStackTrace();
} }
}

User

package com.wenhaitao.Ekt3.Demo1;

public class User {
private String uname;
private String upass; public User() {
} public User(String uname, String upass) {
this.uname = uname;
this.upass = upass;
} public String getUname() {
return uname;
} public void setUname(String uname) {
this.uname = uname;
} public String getUpass() {
return upass;
} public void setUpass(String upass) {
this.upass = upass;
} @Override
public String toString() {
return "User{" +
"uname='" + uname + '\'' +
", upass='" + upass + '\'' +
'}';
}
}

 

 运行结果:

Demo2

package com.wenhaitao.Ekt3.Demo2;

import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; public class Demo2 {
public static void main(String[] args) {
User user = new User();
try {
BeanUtils.setProperty(user, "uname", "肥肥也");
BeanUtils.setProperty(user, "upass", "54920"); System.out.println(BeanUtils.getProperty(user, "uname"));
System.out.println(BeanUtils.getProperty(user, "upass")); //给定一个保存了对象属性的map集合,
Map map = new HashMap();
map.put("uname", "papercy");
map.put("upass", "88888");
BeanUtils.populate(user, map);
System.out.println(user); user = new User("paper", "66666");
Map mp = BeanUtils.describe(user);
Set set = mp.entrySet();
Iterator it = set.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} }
}

运行结果:

 

  • Java Bean 特性

JavaBean 与其它 Java 类相比而言独一无二的特征:

  1. 提供一个默认的无参构造函数。
  2. 需要被序列化并且实现了 Serializable 接口。
  3. 可能有一系列可读写属性。
  4. 可能有一系列的 getter 或 setter 方法。

调用属性步骤:

  1. 根据属性名字获得属性对象(Field)
  2. 赋值:set(obj,value)
  3. 取值:get(obj)
  • 如果需要强制访问类的私有成员,则需要设定:setAccessible(true);

  • ps:

如果,您希望更容易地发现我的新博客,不妨点击一下关注。

如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,

因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【肥肥也】!

Java Bean(Day_05)的更多相关文章

  1. 用大白话聊聊JavaSE -- 如何理解Java Bean(一)

    首先,在开始本章之前,先说一个总的概念:所谓的Java Bean,就是一个java类,编译后成为了一个后缀名是 .class的文件.这就是Java Bean,很多初学者,包括当年的我自己,总是被这些专 ...

  2. Java国际化(i18n)

    Java国际化(i18n) 最近在做一个网站国际化的功能.用Java做开发,使用spring+velocity. Java提供了对i18n的支持,spring对其做了集成,可以很方便的配置.主要思想就 ...

  3. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  4. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  5. java web (j2ee)学习路线 —— 将青春交给命运

    RESON TO DO JAVA WEB:1.JAVA WEB(企业级)  2.Android和iOS过于火爆并且不兼容 一.JAVA WEB开发需要的知识储备 1.      基本的网页设计语言:H ...

  6. 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式   √ id:标识容器中的bean.id唯一. √ cl ...

  7. 《ElasticSearch6.x实战教程》之简单搜索、Java客户端(上)

    第五章-简单搜索 众里寻他千百度 搜索是ES的核心,本节讲解一些基本的简单的搜索. 掌握ES搜索查询的RESTful的API犹如掌握关系型数据库的SQL语句,尽管Java客户端API为我们不需要我们去 ...

  8. Java 反射(一)反射简介、原理和应用场景

    目录 一.动态语言和动态语言的比较 动态语言 静态语言 二.反射 简介 反射的常见使用 1. 代码编辑器 2. Spring等框架的IoC容器 3. 和注解的配合使用 原理 反射优缺点 调试查看 Cl ...

  9. Java基础 (下)

    泛型 Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符? Java 泛型(generics) 是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时 ...

随机推荐

  1. 对象存储服务MinIO安装部署分布式及Spring Boot项目实现文件上传下载

    目录 一.MinIO快速入门 1. MinIO简介 2. CentOS7更换成阿里云镜像 3. 安装 3.1 下载 3.2 运行测试 4. 配置脚本执行文件 4.1 创建配置执行文件 4.2 执行 二 ...

  2. C语言-字符串函数的实现(五)之strstr

    C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...

  3. 8. Centos 7 图像化界面

    Step 1:安装"X Window System" yum groupinstall "X Window System" 当出现 Complete!说明这里安 ...

  4. yolov2算法浅见

    因为最近在复习yolo系列的算法,就借着这个机会总结一下自己对这个算法的理解,由于是第一次写算法类的博客,文中有什么错误和行文不通的地方还希望大家指正. yolov2与yolov1有很多改变. 最重要 ...

  5. BLUENRG-LP 学习笔记

    在学习 BLUENRG-LP 的过程中,及时地把碰到的问题记录下来,并作解答,形成本文档. 该文档会时时更新,并且当某些章节内容过多时,会独立出来,形成新的文章. BLUENRG-LP 的特性 芯片内 ...

  6. 11- APP性能测试GT工具的使用

    对性能测试来说有服务端的性能与客户端(APP)的性能. GT简介 1.GT(随身调)是APP的随身调测平台,它是直接运行在手机上的"集成调试环境"(IDTE) 2.利用GT,仅凭一 ...

  7. Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)

    第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...

  8. Day007 数组的声明与创建

    数组 数组的定义 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组声 ...

  9. Git解决中文乱码问题

    git status 乱码 解决方法: git config --global core.quotepath false git commit 乱码 解决方法: git config --global ...

  10. 基于蒙特卡洛树搜索(MCTS)的多维可加性指标的异常根因定位

    摘要:本文是我在从事AIOps研发工作中做的基于MCTS的多维可加性指标的异常根因定位方案,方案基于清华大学AIOPs实验室提出的Hotspot算法,在此基础上做了适当的修改. 1        概述 ...