当前位置:首页 > Java技术文章 > Java内省实例解析

实例详解Java内省

  • 发布时间:
  • 作者:码农之家原创
  • 点击:191

这篇文章主要知识点是关于java、Java内省、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下java相关资源

21天学通HTML+CSS+JavaScript Web开发

21天学通HTML CSS JavaScript Web开发(第7版) 是全球畅销书《21天学通使用HTML与CSS发布Web站点》的全新升级版本,作者在本书囊括了新的HTML5与CSS3技术,并采用易于理解的步骤式教程讲解了这些技

查看详情

Java内省实例解析

图像中轮廓的个数,里面vector的size代表了轮廓上点的个数。了解JavaBean

内省对应的英文单词为IntroSpector,它主要用于对JavaBean进行操作,JavaBean是一种特殊的Java类,其中的某些方法符合某种命名规则,如果一个Java类中的一些方法符合某种命名规则,则可以把它当作JavaBean来使用。

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

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(ValueObject,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。

例如:

setId()的属性名-->id

isLast()的属性名-->last

setCPU的属性名是什么?-->CPU

getUPS的属性名是什么?-->UPS

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

一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:

在JavaEE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!

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

对JavaBean的简单内省操作

主要用到了java.beans.PropertyDescriptor类,用来得到某个Class对象属性集中的某个JavaBean属性,然后调用getReadMethod()、getWriteMethod()方法获得相应的get、set方法。

代码示例:

Domain类:

[cpp]viewplaincopy

intmain()

package ustc.lichunchun.bean;
import java.util.Date;
public class ReflectPoint { 
  private Date birthday = new Date();
private int x;
public int y;
public String str1 = "ball";
public String str2 = "basketball";
public String str3 = "itcast";
public ReflectPoint(int x, int y) {
	super();
	this.x = x;
	this.y = y;
}
@Override 
  public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + x;
	result = prime * result + y;
	return result;
}
@Override 
  public Boolean equals(Object obj) {
	if (this == obj) 
	      return true;
	if (obj == null) 
	      return false;
	if (getClass() != obj.getClass()) 
	      return false;
	final ReflectPoint other = (ReflectPoint) obj;
	if (x != other.x) 
	      return false;
	if (y != other.y) 
	      return false;
	return true;
}
@Override 
  public String toString(){
	return str1 + ":" + str2 + ":" + str3;
}
public int getX() {
	return x;
}
public void setX(int x) {
	this.x = x;
}
public int getY() {
	return y;
}
public void setY(int y) {
	this.y = y;
}
public Date getBirthday() {
	return birthday;
}
public void setBirthday(Date birthday) {
	this.birthday = birthday;
}
}

简单内省操作:

package ustc.lichunchun.bean;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class IntroSpectorTest {
	public static void main(String[] args) throws Exception {
		ReflectPoint pt1 = new ReflectPoint(3, 5);
		String propertyName = "x";
		//"x"-->"X"-->"getX"-->MethodGetX--> 
		getProperty(pt1, propertyName);
		Object value = 7;
		setProperty(pt1, propertyName, value);
		System.out.println(pt1.getX());
	}
	private static void setProperty(Object pt1, String propertyName, Object value) 
	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {
		PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
		Method methodSetX = pd.getWriteMethod();
		methodSetX.invoke(pt1, value);
	}
	private static Object getProperty(Object pt1, String propertyName) 
	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {
		PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
		Method methodGetX = pd.getReadMethod();
		methodGetX.invoke(pt1);
	}
}

对JavaBean的复杂内省操作

采用遍历BeanInfo的所有属性方式来查找和设置某个RefectPoint对象的x属性。在程序中把一个类当作JavaBean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息。

复杂内省操作:

package ustc.lichunchun.bean;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class IntroSpectorTest {
	public static void main(String[] args) throws Exception {
		ReflectPoint pt1 = new ReflectPoint(3, 5);
		String propertyName = "x";
		//"x"-->"X"-->"getX"-->MethodGetX--> 
		Object retVal = getProperty(pt1, propertyName);
		System.out.println(retVal);
		Object value = 7;
		setProperty(pt1, propertyName, value);
		System.out.println(pt1.getX());
	}
	private static void setProperty(Object pt1, String propertyName, Object value) 
	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {
		PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
		Method methodSetX = pd.getWriteMethod();
		methodSetX.invoke(pt1, value);
	}
	private static Object getProperty(Object pt1, String propertyName) 
	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {
		/* 
    PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass()); 
    Method methodGetX = pd.getReadMethod(); 
    methodGetX.invoke(pt1); 
    */
		BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		Object retVal = null;
		for (PropertyDescriptor pd : pds){
			if(pd.getName().equals(propertyName)){
				Method methodGetX = pd.getReadMethod();
				retVal = methodGetX.invoke(pt1);
				break;
			}
		}
		return retVal;
	}
}

使用BeanUtils工具包操作JavaBean

在前面内省例子的基础上,用BeanUtils类先get原来设置好的属性,再将其set为一个新值。get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串。

用PropertyUtils类先get原来设置好的属性,再将其set为一个新值。get属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型。

注意:用这两个类之前,需要在eclipse工程的lib文件夹中导入commons-beanutils.jar、commons-logging-1.1.jar两个jar包,并且AddtoBuildPath。

代码示例:

package ustc.lichunchun.bean;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class IntroSpectorTest {
	public static void main(String[] args) throws Exception {
		ReflectPoint pt1 = new ReflectPoint(3, 5);
		String propertyName = "x";
		//"x"-->"X"-->"getX"-->MethodGetX--> 
		Object retVal = getProperty(pt1, propertyName);
		System.out.println(retVal);
		Object value = 7;
		setProperty(pt1, propertyName, value);
		System.out.println(BeanUtils.getProperty(pt1, "x").getClass().getName());
		//String 
		BeanUtils.setProperty(pt1, "x", "9");
		System.out.println(pt1.getX());
		/* 
    Map map = {name:"zxx",age:18};//java7的新特性 
    BeanUtils.setProperty(map, "name", "lcc"); 
    */
		BeanUtils.setProperty(pt1, "birthday.time", "111");
		//支持属性链 
		System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));
		PropertyUtils.setProperty(pt1, "x", 23);
		System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());
		//Integer 
		/* 
    BeanUtils和PropertyUtils的区别: 
    BeanUtils以字符串形式对JavaBean进行操作,也可以操作Map类,并且可以讲JavaBean和Map进行互相转换(describe、populate) 
    PropertyUtils以JavaBean属性本身的数据类型进行操作   
     */
	}
	private static void setProperty(Object pt1, String propertyName, Object value) 
	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {
		PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
		Method methodSetX = pd.getWriteMethod();
		methodSetX.invoke(pt1, value);
	}
	private static Object getProperty(Object pt1, String propertyName) 
	      throws IntrospectionException, IllegalAccessException, InvocationTargetException {
		/* 
    PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass()); 
    Method methodGetX = pd.getReadMethod(); 
    methodGetX.invoke(pt1); 
    */
		BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		Object retVal = null;
		for (PropertyDescriptor pd : pds){
			if(pd.getName().equals(propertyName)){
				Method methodGetX = pd.getReadMethod();
				retVal = methodGetX.invoke(pt1);
				break;
			}
		}
		return retVal;
	}
}

总结

以上就是本文关于Java内省实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

以上就是本次给大家分享的关于Java的全部知识点内容总结,大家还可以在下方相关文章里找到Java实现快速排序原理分析、 Java文件和base64流相互转换、 java图形界面编程的代码详、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:Java并发系列之CountDownLatch源码分析

下一篇:Java常用排序算法整理分享

展开 +

收起 -

Java内省 相关内容
Java内部类原理及用法详解

这篇文章主要介绍了Java内部类原理与用法,结合实例形式总结分析了非静态内部类、静态内部类、局部类等相关概念、原理、用法及相关操作注意事项,需要的朋友可以参考下

查看详情
Java实现随机10道10以内加减法的代码详解

这篇文章主要介绍了Java实现随机出题,10道10以内加减法计算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习

查看详情
Java中的内存泄露代码详细分析

这篇文章主要介绍了Java语言中的内存泄露代码详解,具有一定借鉴价值,需要的朋友可以参考下。

查看详情
Java性能权威指南

本书对Java 7和Java 8中影响性能的因素展开了全面深入的介绍,讲解传统上影响应用性能的JVM特征,包括即时编译器、垃圾收集、语言特征等。内容包括:用G1垃圾收集器应用的吞吐量;使用Ja

查看详情
Java程序员修炼之道

伴随着关键服务平台及其生态体系的与时俱进,Java技术性一直在迅速往前发展趋势。《 Java程序员修炼之道 》包含了Java7的**特性和Java开发设计的核心技术,对当今很多开源系统技术性共存,

查看详情
HTML5+CSS3+JavaScript从入门到精通

本书以基础知识、示例、实战案例相结合的方式详尽讲述了HTML,CSS,JavaScript及目前最新的前端技术

查看详情
Java Web开发实例大全:提高卷

本书筛选、汇集了Java Web开发从基础知识到高级应用各个层面,含600经典实例及源码分析,23个应用方向,两卷共1200例,46个方向,供学习、速查、实践练习的超全参考手册

查看详情
Java程序员面试宝典

Java程序员面试宝典(第4版) 是《Java程序员面试宝典》的第4版。第4版在保留前三版数据结构、字符串处理、Java程序设计等主干内容的基础上,更新了部分程序员面试题目,内容主要取材于

查看详情
Java经典实例

Java经典实例(第三版) 从lambda表达式、JavaFX 8,到网络编程和支持移动设备等方面,Java 8都有许多更新。包含了数百个经过实践验证的技巧,内容涵盖了广泛的Java主题,可帮助你快速进入编程

查看详情
软件设计模式:Java版

程细柱编著的《 软件设计模式 》从面向对象程序设计的7个基本原则出发,用浅显易懂、可视化的UML建模语言逐一介绍GoF的23种经典设计模式。全书共9章,内容包括设计模式基础、创建型设计

查看详情
Java内省 学习笔记
网友NO.408246

原生JavaScript实现的简单省市县三级联动功能示例

本文实例讲述了原生JavaScript实现的简单省市县三级联动功能。分享给大家供大家参考,具体如下: 三级联动是我们写表单时必不可少的,比如在写收货地址时,就用到他了,最近在看原生JavaScript,从基础写起,待完善,以后再写个jquery版的 !DOCTYPE htmlhtml lang="en"headmeta charset="UTF-8"title三级联动菜单/titlestyleselect {font-family: "萝莉体 第二版";}.hide {display: none;}/style/headbodydivselect id="province"option-请选择-/option/selectselect id="city" class="hide"option-请选择-/option/selectselect id="area" class="hide"option-请选择-/option/select/divscriptvar provinceList = ['北京市', '河北省', '浙江省'];var cityList = [['东城区', '西城区', '海淀区'], ['廊坊市', '唐山市', '石家庄市', '承德市'], ['杭州市', '温州市', '宁波市', '嘉兴市', '绍兴市']];var areasList = [[['东城区1', '东城区2', '东城区3'],['西城区1', '西城区2', '西……

网友NO.537269

Java框架SSH结合Easyui控件实现省市县三级联动示例解析

Easyui调用数据库实现省市县区三级联动的效果如果下 1、首先要设计数据库,如图所示。 一个有4个字段code,note,pycode。code:行政区划代码,note:中文注释,pycode:拼音缩写。 其中code是由6个字段组成。如果是省级最后4位是0000,如果是地级市最后2位是00,其他是县区。 我已经把相关数据库代码上传到我的csdn资源中,需要的同学自行下载。 2、我用的是java、SSH框架结合Easyui控件 3、html代码如下 tr td class="left"省:/td tdinput name="contact.province" id="province" /td td class="left"市:/td tdinput name="contact.city" id="city" /td td class="left"县区:/td tdinput name="contact.county" id="county" /td /tr 4、对应的JS代码如下 $(function(){ // 下拉框选择控件,下拉框的内容是动态查询数据库信息 $('#province').combobox({ url:'apply/provinceCombobox_combobox.action', editable:false, //不可编辑状态 cache: false, // panelHeight: ……

网友NO.451128

解决JavaScript实现省市联动过程中的bug

先把实现省市联动遇到的问题描述一下 1.1.原来的思路 1.1.1、初始化加载省份 $.ajax({ 'type' : 'POST', 'dataType' : 'json', 'url' : '${rc.contextPath}/crm/merchantMgr/editMerchantBankAccount.htm?method=getBankProvinces', 'success' : function(msg) { bankProvinces = msg; for(var i=0;ibankProvinces.length;i++){ $("#key_DSGAprovince").append("option value='"+bankProvinces[i][0]+"'"+bankProvinces[i][0]+"/option"); } }, 'cache' : false, 'async' : false }); 1.1.2、当点击省份的时候加载城市 function getBankCitys(){$("#key_DSGAcity").empty(); var DSGAprovince=$("#key_DSGAprovince option:selected").text(); $.ajax({ 'type':'POST', 'data': {"province":DSGAprovince}, 'dataType': 'json', 'url':'${rc.contextPath}/crm/merchantMgr/editMerchantBankAccount.htm?method=getBankCities', 'success' : function(msg) { cities = msg; for(var i=0;icities.length;i++){ $("#key_DSGAcity").append("option value='"+cities[i][0]+"'"+cities[i][0]+"/option"); } }, });} 1.1.3、问题点 当……

网友NO.148464

Java利用Request请求如何获取IP地址对应的省份、城市详解

前言 最近的一个项目中需要将不同省份的用户,展示不同内容,所以需要通过Request请求获取IP地址, 然后通过IP获取IP对应省份。 这里的操作步骤一共有步: 1. 通过Request获取IP 2. 通过IP获取对应省份、城市 3. 通过设置的省份和IP对应省份进行比对,展示内容 通过Request获取IP 可以参考我的另外一篇文章【Java 通过Request请求获取IP地址】下面是代码: public class IpAdrressUtil { /** * 获取Ip地址 * @param request * @return */ private static String getIpAdrress(HttpServletRequest request) { String Xip = request.getHeader("X-Real-IP"); String XFor = request.getHeader("X-Forwarded-For"); if(StringUtils.isNotEmpty(XFor) !"unKnown".equalsIgnoreCase(XFor)){ //多次反向代理后会有多个ip值,第一个ip才是真实ip int index = XFor.indexOf(","); if(index != -1){ return XFor.substring(0,index); }else{ return XFor; } } XFor = Xip; if(StringUtils.isNotEmpty(XFor) !"unKnown"……

<
1
>

Copyright 2018-2020 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

版权投诉 / 书籍推广 / 赞助:QQ:520161757