2019独角兽企业重金招聘Python工程师标准>>>

内省基本概念

内省(IntroSpector)是Java语言对Bean类属性、事件的一种缺省处理方法。如类A中有属性name,那我们可以通过getName,setName来得到其值或设置新的值。通过getName/setName来访问name属性,这就是默认的规则。

Java中提供了一套API用来访问某个属性的getter/setter方法,通过这些API可以使你不需要了解这个规则,这些API在java.beans中,一般的做法是通过Introspector的getBeanInfo方法来获取某个对象的BeanInfo信息,然后通过BeanIfno来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后就可以通过反制机制来调用这些方法

Introspector 相关 API

  1. Introspector类

Introspetor类为通过工具学习有关受目标JavaBean支持的属性、事件和方法的知识提供了一个标准方法:

static BeanInfo getBeanInfo(Class<?> beanClass)

在JavaBean上进行内省, 了解其所有属性 ,公开的方法和事件

  1. BeanInfo类

该类实现此BeanInfo接口并提供有关其bean的方法、属性、事件等显示信息

MethodDescriptor[] getMethodDescriptors()

获得beans MethodDescriptor

PropertyDescriptro[] getPropertyDescriptors()

获得beans PropertyDescriptor

  1. PropertyDescriptor 类

PropertyDescriptor描述JavaBean通过一对存储器方法导出的一个属性

Method getReadMethod()

获取读取属性的方法

Method getWriteMethod()

获得用于定稿属性值的方法

  1. MethodDescriptor类

MethodDescriptor描述了一种特殊方法

即JavaBean支持从其它脑袋瓜地其进行外部访问

Method getMethod()

获得此MethodDescriptro封闭的方法

user

package com.laolang.se.fanshe.domain;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** 被代理类*/
public class User  {private static final Logger log = LoggerFactory.getLogger(User.class);public User() {log.info("调用无参构造函数");}public User(Long id, String name, Integer age) {log.info("调用带参构造函数");this.id = id;this.name = name;this.age = age;}private String say(){return name;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}public Long getId() {return id;}public void setId(Long id) {this.id = id;}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;}private Long id;private String name;private Integer age;}

UserFactory

package com.laolang.se.fanshe;import com.laolang.se.fanshe.domain.User;import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;public class UserFactory {private static  Properties config = new Properties();static {InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("bean.properties");// 加载属性文件try {config.load(inputStream);} catch (IOException e) {e.printStackTrace();}}public static User getUser(String name) {String className = config.getProperty(name);try {Class<?> clazz = Class.forName(className);User user = (User) clazz.newInstance();// 内省:获取bean信息BeanInfo beanInfo = Introspector.getBeanInfo(clazz);// 通过bean信息获取所有属性描述器PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {if("name".equals(propertyDescriptor.getName())){String userName = config.getProperty("user.name");Method method = propertyDescriptor.getWriteMethod();method.invoke(user,userName);}else if ("age".equals(propertyDescriptor.getName())){Method method = propertyDescriptor.getWriteMethod();method.invoke(user,Integer.parseInt(config.getProperty("user.age")));}else if ( "id".equals(propertyDescriptor.getName())){Method method = propertyDescriptor.getWriteMethod();method.invoke(user,Long.parseLong(config.getProperty("user.id")));}}return user;} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IntrospectionException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return null;}
}

Main

package com.laolang.se.fanshe;import com.laolang.se.fanshe.domain.User;public class Main {public static void main(String[] args) {User user = UserFactory.getUser("user");System.out.println(user);}
}

bean.properties

# 配置JavaBean信息
user=com.laolang.se.fanshe.domain.User
user.name=小代码
user.age=23
user.id=1

转载于:https://my.oschina.net/iamhere/blog/858896

121 项目 024 笔记向 内省机制相关推荐

  1. 121 项目 023 笔记向 反射

    2019独角兽企业重金招聘Python工程师标准>>> 反射 Class对象 Class 类是一切反射的根源 得到Class类的对象有一种方式: Object.getClass() ...

  2. 121 项目 008 笔记向 maven-study 常用插件

    2019独角兽企业重金招聘Python工程师标准>>> test <reporting><plugins><!-- mvn cobertura:help ...

  3. spring boot 前后端分离项目(商城项目)学习笔记

    spring boot 前后端分离项目(商城项目)学习笔记 目录 spring boot 前后端分离项目(商城项目)学习笔记 后端配置 springboot项目 pom.xml文件 maven 配置文 ...

  4. [Openwrt 项目开发笔记]:Samba服务vsFTP服务(四)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 在上一节中,我们讲述了如何在路由器上挂载U盘,以 ...

  5. java 内省机制_Java反射与内省机制总结

    Class对象封装了一个java类定义的成员变量.成员方法.构造方法.包名.类名等. 2.反射怎么用 1).获得java类的各个组成部分,首先需要获得代表java类的Class对象 获得Class对象 ...

  6. java内省_java内省机制

    一.内省是什么.实现方式: 内省(Introspector)是Java语言对Bean类属性.事件的一种缺省处理方法. 例如类A中有属性name,那我们可以通过getName,setName来得到其值或 ...

  7. java的 内省机制_Java 内省机制

    Java 内省机制 一.内省机制概述 ​ Java 中的反射机制是通过名称得到类的方法和对象的成份,对于一切 Java 类都是适用的,但是有时候使用起来比较麻烦.而 JavaBean 是一种特殊的 J ...

  8. java内省的意思,java内省机制 + 内省是什么 + 内省实现方式 + 和反射的区别

    见:https://zhidao.baidu.com/question/434288330.html.http://blog.csdn.net/u014394715/article/details/5 ...

  9. Java内省用法_java内省机制及PropertyUtils使用方法

    反射 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术.例如我们可以通过类 名来生成一个类的实例:知道了方法名,就可以调用这个方法 ...

最新文章

  1. 百度Apollo发布中国首个自动驾驶安全报告,L3级别产品2020年量产上市
  2. python经典案例-Python递归的经典案例
  3. jQuery遍历函数总结
  4. pycharm ssh mysql_PyCharm使用之配置SSH Interpreter的方法步骤
  5. 机器学习模型开发必读:开源数据库最全盘点
  6. 计算机毕业设计答辩慌?软工本科 Java EE 毕设项目答辩问题、答案汇总指南奉上
  7. Gradle学习之构建java与web项目
  8. [bbk2908]第4集 - Chapter 03 - 介绍RAC的体系结构
  9. Android基础 淡入淡出、上下弹出动画的
  10. 下一步目标:整理出1套相对成熟的ios 开发框架
  11. 我的世界联机侠java_我的世界联机侠手机版-我的世界联机侠下载-Minecraft中文分享站...
  12. java jsp中文乱码怎么解决_分享JSP中文乱码解决方法
  13. word转pdf实现,POIXMLDocumentPart.getPackageRelationship()Lorg...问题,以及NotOfficeXmlFileException...问题
  14. 石墨文档服务器版,石墨文档功能一览
  15. CTF-安全杂项-BAT公司信息查询系统
  16. JavaScript基础小节——手写重点整理02
  17. 计算机自带游戏在哪里打开,今天才知道,原来电脑上自带游戏模式,开启后瞬间提升流畅度...
  18. 基因相关性(C语言)
  19. 举个栗子!Tableau 技巧(175):通过 URL 传参实现不同工作簿的跳转
  20. C# 20行代码解析KRC歌词内容

热门文章

  1. linux Enterprise5 添加删除程序无法正常使用 解决
  2. 被开除的Roadstar合伙人决定暂不回应,“报销大保健”也能忍?
  3. Nature机器学习子刊被讽开历史倒车,Jeff Dean等数百学者签名抵制
  4. “找个心动的人就辣么难嘛 _ ” 别灰心,试试用了AI的Tinder
  5. iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码
  6. OSS内文件如何设置为无时间限制的下载链接
  7. 解决SpringBoot jar包太大的问题
  8. Java NIO和IO的主要区别
  9. 三星死守中国市场,强撑溢价难挽回颓势吗?
  10. 通过AccessKey调用阿里云CDN接口刷新CDN资源案例