121 项目 024 笔记向 内省机制
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
- Introspector类
Introspetor类为通过工具学习有关受目标JavaBean支持的属性、事件和方法的知识提供了一个标准方法:
static BeanInfo getBeanInfo(Class<?> beanClass)
在JavaBean上进行内省, 了解其所有属性 ,公开的方法和事件
- BeanInfo类
该类实现此BeanInfo接口并提供有关其bean的方法、属性、事件等显示信息
MethodDescriptor[] getMethodDescriptors()
获得beans MethodDescriptor
PropertyDescriptro[] getPropertyDescriptors()
获得beans PropertyDescriptor
- PropertyDescriptor 类
PropertyDescriptor描述JavaBean通过一对存储器方法导出的一个属性
Method getReadMethod()
获取读取属性的方法
Method getWriteMethod()
获得用于定稿属性值的方法
- 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 笔记向 内省机制相关推荐
- 121 项目 023 笔记向 反射
2019独角兽企业重金招聘Python工程师标准>>> 反射 Class对象 Class 类是一切反射的根源 得到Class类的对象有一种方式: Object.getClass() ...
- 121 项目 008 笔记向 maven-study 常用插件
2019独角兽企业重金招聘Python工程师标准>>> test <reporting><plugins><!-- mvn cobertura:help ...
- spring boot 前后端分离项目(商城项目)学习笔记
spring boot 前后端分离项目(商城项目)学习笔记 目录 spring boot 前后端分离项目(商城项目)学习笔记 后端配置 springboot项目 pom.xml文件 maven 配置文 ...
- [Openwrt 项目开发笔记]:Samba服务vsFTP服务(四)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 在上一节中,我们讲述了如何在路由器上挂载U盘,以 ...
- java 内省机制_Java反射与内省机制总结
Class对象封装了一个java类定义的成员变量.成员方法.构造方法.包名.类名等. 2.反射怎么用 1).获得java类的各个组成部分,首先需要获得代表java类的Class对象 获得Class对象 ...
- java内省_java内省机制
一.内省是什么.实现方式: 内省(Introspector)是Java语言对Bean类属性.事件的一种缺省处理方法. 例如类A中有属性name,那我们可以通过getName,setName来得到其值或 ...
- java的 内省机制_Java 内省机制
Java 内省机制 一.内省机制概述 Java 中的反射机制是通过名称得到类的方法和对象的成份,对于一切 Java 类都是适用的,但是有时候使用起来比较麻烦.而 JavaBean 是一种特殊的 J ...
- java内省的意思,java内省机制 + 内省是什么 + 内省实现方式 + 和反射的区别
见:https://zhidao.baidu.com/question/434288330.html.http://blog.csdn.net/u014394715/article/details/5 ...
- Java内省用法_java内省机制及PropertyUtils使用方法
反射 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术.例如我们可以通过类 名来生成一个类的实例:知道了方法名,就可以调用这个方法 ...
最新文章
- 百度Apollo发布中国首个自动驾驶安全报告,L3级别产品2020年量产上市
- python经典案例-Python递归的经典案例
- jQuery遍历函数总结
- pycharm ssh mysql_PyCharm使用之配置SSH Interpreter的方法步骤
- 机器学习模型开发必读:开源数据库最全盘点
- 计算机毕业设计答辩慌?软工本科 Java EE 毕设项目答辩问题、答案汇总指南奉上
- Gradle学习之构建java与web项目
- [bbk2908]第4集 - Chapter 03 - 介绍RAC的体系结构
- Android基础 淡入淡出、上下弹出动画的
- 下一步目标:整理出1套相对成熟的ios 开发框架
- 我的世界联机侠java_我的世界联机侠手机版-我的世界联机侠下载-Minecraft中文分享站...
- java jsp中文乱码怎么解决_分享JSP中文乱码解决方法
- word转pdf实现,POIXMLDocumentPart.getPackageRelationship()Lorg...问题,以及NotOfficeXmlFileException...问题
- 石墨文档服务器版,石墨文档功能一览
- CTF-安全杂项-BAT公司信息查询系统
- JavaScript基础小节——手写重点整理02
- 计算机自带游戏在哪里打开,今天才知道,原来电脑上自带游戏模式,开启后瞬间提升流畅度...
- 基因相关性(C语言)
- 举个栗子!Tableau 技巧(175):通过 URL 传参实现不同工作簿的跳转
- C# 20行代码解析KRC歌词内容
热门文章
- linux Enterprise5 添加删除程序无法正常使用 解决
- 被开除的Roadstar合伙人决定暂不回应,“报销大保健”也能忍?
- Nature机器学习子刊被讽开历史倒车,Jeff Dean等数百学者签名抵制
- “找个心动的人就辣么难嘛 _ ” 别灰心,试试用了AI的Tinder
- iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码
- OSS内文件如何设置为无时间限制的下载链接
- 解决SpringBoot jar包太大的问题
- Java NIO和IO的主要区别
- 三星死守中国市场,强撑溢价难挽回颓势吗?
- 通过AccessKey调用阿里云CDN接口刷新CDN资源案例