`

Java变量类型识别的3种方式

    博客分类:
  • java
阅读更多

变量类型识别有3种方法:

  1. 通过反射拿到变量的类型
  2. instanceof关键字判断
  3. 通过java的多态(方法重载)来DIY类型识别

具体看例子吧,尤其第三种方式 有一个自定义的TypeTools,我觉得很实用。希望大家喜欢~

package com.cxyapi.oo;

/** 类型识别工具测试类
 * @author cxy @ www.cxyapi.com
 */
public class TypeToolsTest
{
	public static void main(String[] args)
	{
		int i=0;
		TypeObject to=new TypeObject();
		//1.反射
		System.out.println("to的类型:"+to.getClass().getSimpleName());
		System.out.println(int.class.getSimpleName());
		System.out.println(Integer.class.getSimpleName());
		//但是对于一个不确定类型的基本数据类型变量我们没法用反射来获取其类型。
		System.out.println("----------------------");
		
		//2.instanceof
		if(to instanceof TypeObject){ System.out.println("to是TypeObject类型的");}
		//但是这种办法貌似也没法确定基本数据类型
		System.out.println("----------------------");
		
		//以上两种方式对于对象,引用类型的都很好用,但是对基本数据类型就不那么好用了。
		//3.通过多态(方法的重载)
		System.out.println("i是:"+TypeTools.getType(i));
		System.out.println("to是:"+TypeTools.getType(to));
		System.out.println("\"cxyapi\"是:"+TypeTools.getType("www.cxyapi.com"));
		//大家可以看出来 最后一种方式使用多态的方式达到了检测类型(基本类型和引用类型)的目的
		//它除了弥补其他两种方式不能检测基本数据类型的不足在外,还能自己DIY类型信息
	}
}

//定义一个类,为了演示引用类型的类型检测
class TypeObject{}

 

    自定义的类型识别工具:

package com.cxyapi.oo;

import java.util.HashMap;
import java.util.Map;

/** 类型识别工具
 * @author cxy @ www.cxyapi.com
 */
public class TypeTools
{
	//获得类型
	public static Map<String,String> getType(Object o)
	{
		Map<String,String> typeInfo=new HashMap<String,String>();
		typeInfo.put("类型", o.getClass().getSimpleName());
		typeInfo.put("描述", "引用类型");
		return typeInfo;
	}
	
	public static Map<String,String> getType(int i)
	{
		Map<String,String> typeInfo=new HashMap<String,String>();
		typeInfo.put("类型", "int");
		typeInfo.put("描述", "整形");
		return typeInfo;
	}
	
	public static Map<String,String> getType(long l)
	{
		Map<String,String> typeInfo=new HashMap<String,String>();
		typeInfo.put("类型", "long");
		typeInfo.put("描述", "长整型");
		return typeInfo;
	}
	
	public static Map<String,String> getType(boolean b)
	{
		Map<String,String> typeInfo=new HashMap<String,String>();
		typeInfo.put("类型", "boolean");
		typeInfo.put("描述", "布尔类型");
		return typeInfo;
	}
	
	public static Map<String,String> getType(char b)
	{
		Map<String,String> typeInfo=new HashMap<String,String>();
		typeInfo.put("类型", "char");
		typeInfo.put("描述", "字符");
		return typeInfo;
	}
	
	public static Map<String,String> getType(float f)
	{
		Map<String,String> typeInfo=new HashMap<String,String>();
		typeInfo.put("类型", "float");
		typeInfo.put("描述", "单精度浮点型");
		return typeInfo;
	}
	
	public static Map<String,String> getType(double d)
	{
		Map<String,String> typeInfo=new HashMap<String,String>();
		typeInfo.put("类型", "double");
		typeInfo.put("描述", "双精度浮点型");
		return typeInfo;
	}
	
	public static Map<String,String> getType(String s)
	{
		Map<String,String> typeInfo=new HashMap<String,String>();
		typeInfo.put("类型", "String");
		typeInfo.put("描述", "字符串类型");
		return typeInfo;
	}
	
}

 

声明:

1.原创文章,转载请标明并加本文连接。

2.文章反映个人愚见,如有异议欢迎讨论指正

3.更多的内容请看我的  个人博客(测试版)

14
1
分享到:
评论
16 楼 拿破仑正方形 2013-03-14  
DIY类型识别不错,虽然用处没有那么大,但思路确很好!!
15 楼 snkcxy 2013-03-13  
cuitongxin 写道
看了你们上面的讨论都比较细,记着别漏了:Class.isInstance(Object obj) 方法,也可以。
在下倒是认为JAVA变量类型识别倒是可以分为两个大类别:1、RTTI 类型识别。2、反射来识别。

您可以讲讲Java RTTI如何实现。和反射的区别
14 楼 snkcxy 2013-03-13  
cuitongxin 写道
看了你们上面的讨论都比较细,记着别漏了:Class.isInstance(Object obj) 方法,也可以。
在下倒是认为JAVA变量类型识别倒是可以分为两个大类别:1、RTTI 类型识别。2、反射来识别。


很不错的建议~
13 楼 cuitongxin 2013-03-13  
看了你们上面的讨论都比较细,记着别漏了:Class.isInstance(Object obj) 方法,也可以。
在下倒是认为JAVA变量类型识别倒是可以分为两个大类别:1、RTTI 类型识别。2、反射来识别。
12 楼 snkcxy 2013-03-13  
jiaohuizhe 写道
实际上第三种方法用处不大,...

呵呵 终于看懂你的想法了。
总结一下:
1.java对象(都是继承Object),具有通用型和不确定性,所以它有必要去判断类型
2.反射应该使用getName()来获取全路径免得 有类重名的情况。
我理解的没错吧?
解释:
1.这个在java运行过程中确实 意义不太大 判断基本数据类型不具有不确定性,这个可能也就在判断一些常量的时候还能起点作用,TypeTools.getType(2);呵呵 但是这个意义确实不打
但是考虑一种情况,不知道您对jvm动态脚本语言熟悉么?或者说java的JavaCompiler类,也就是说动态的编译和执行java,这个时候类型是可以当作参数的,具有很大的不确定性,当它执行的时候 这个判断类型的方法是不是就有用武之地了呢?
2.您说的很多 真实使用 是需要用getName(),这个是我在写这个例子为了演示简单 而改的,因为我在实际教学中 很多学生看到一长串的包名 两个眼睛就变成@@了。呵呵所以那会就改成getSimpleName了,这里忘记改过来了。您提的非常对,在iteye上发表这个是应该改成getName

不知道我的回答您满意吗?
非常感谢关注
也欢迎继续讨论~
11 楼 jiaohuizhe 2013-03-13  
实际上第三种方法用处不大,调用方法的时候是根据传入的参数的类型来判断的,按照传入变量的定义类型选择调用对应的方法,如果你已经确认变量的类型了,那调用的是对应的方法像getType(String s),但是要实现的功能是要得到变量的类型的话说明是不知道变量的类型,那么调用的应该都是getType(Object o)。
例:
String s="";
Object o="";
这两个变量都是字符串类型,但是因为分别提按照String和Object来定义,那么调用 getType 时是分别调用 getType(String s)和getType(Object o)的,所以要得到变量的类型一般是使用前两种方式的。

使用时如果已经确定变量类型的范围,那么建议使用instanceof,如果不确认变量的范围的话就使用Object.getClass().getName()来得到,而getSimpleName只能得到类名得不到包名这就不能确认这个对象了,毕竟有很多重名的类还需要依靠包名来进行判断的像java.util.Date和java.sql.Date。
10 楼 snkcxy 2013-03-13  
li370036149 写道
个人感觉,第三种方法和instanceof 没有本质区别。都不够灵活。

第三种方法 哪里不灵活?什么变量的类型不能判断?(不要说null,null不是变量的类型)
第三种方式意在于使用多态的特性从侧面弥补反射和instanceof 不能判断基本类型的问题。
如果这位朋友有好的方法 不妨指教一下~
9 楼 snkcxy 2013-03-13  
li370036149 写道
个人感觉,第三种方法和instanceof 没有本质区别。都不够灵活。

instanceof  如何判断 基本类型? 比如int double?
8 楼 li370036149 2013-03-13  
个人感觉,第三种方法和instanceof 没有本质区别。都不够灵活。
7 楼 snkcxy 2013-03-12  
panggezi 写道
楼主,getType(null)就挂了。没什么大意义,你能想一个需要runtime获得primitive type的场景吗?

真抱歉 删了你一条评论,主要是我没有想到那条只存在不到1分钟的评论 会被你引用回复了~
我要是早点看到了您对我那篇删除的评论的回复,我肯定就不删除那篇错误的评论了....
既然是基于已经删除的错误评论的评论 那就没必要存在了~
如果这样引起您的不满 在这里 我表示诚恳的道歉~
6 楼 snkcxy 2013-03-12  
panggezi 写道
楼主,getType(null)就挂了。没什么大意义,你能想一个需要runtime获得primitive type的场景吗?

晕  这位朋友的手还真快~ 最初我点的那个回答有些问题,没想到还没删就被你回了
我又写了一个回答
欢迎讨论指教
5 楼 snkcxy 2013-03-12  
panggezi 写道
楼主,getType(null)就挂了。没什么大意义,你能想一个需要runtime获得primitive type的场景吗?

呵呵 这位朋友提了一个很高深的问题呀~
首先 本文讨论的是获得Java获得变量类型的方法,null属于变量的类型么?null应该是无类型的吧? 用 instanceof 判断 它是不属于任何一种类型的(primitive type or reference type) 因为你不可能定义一个 null a=null;的 表达式吧?
很有意思的是 如果你getType(null)  Java的多态 会处理成String类型的,那么如果想判断一下null 那就在getType(String a)方法里判断一下吧。
您指的需要runtime获取类型 是 JVM开发吗?我不太熟知您所说的领域,不过我能想到的是 找一个jvm动态脚本语言去分析后再执行java代码是完全没问题的。至于已经执行的class能动态分析自己。这个赎本人才疏学浅,欢迎讨论指教
4 楼 panggezi 2013-03-12  
楼主,getType(null)就挂了。没什么大意义,你能想一个需要runtime获得primitive type的场景吗?
3 楼 snkcxy 2013-03-12  
ahack 写道
System.out.println("abc" instanceof String);

您的这种方式 我的文章里有~
instanceof关键字判断 这种方式的弊端就是没法“动态”的判断基本类型,他只能判断引用类型
Stirng可不是基本类型哦~
有兴趣 可以看看 http://snkcxy.iteye.com/admin/blogs/1815007
2 楼 ahack 2013-03-12  
System.out.println("abc" instanceof String);
1 楼 snkcxy 2013-03-12  
如果大家有更好的方法 欢迎交流~

相关推荐

    java自动识别图片中的二维码

    利用java自动识别图片中的二维码并解析二维码中的数据利用java自动识别图片中的二维码并解析二维码中的数据利用java自动识别图片中的二维码并解析二维码中的数据利用java自动识别图片中的二维码并解析二维码中的数据...

    java实现人脸识别

    java实现人脸识别登录,人脸识别是将摄像头捕捉到的人脸流媒体数据和数据库查询出来的base64字符数据上传到云服务器进行系统比对 百度云API

    JAVA识别OFD电子发票文件

    根据OFD文件打包规范编写的OFD电子发票关键信息识别与读取。整个类无第三方引用包,使用纯dom编写,使用方便稳定。程序可识别出电子发票上的发票代码、发票号码、合计税额、合计金额、开票日期等信息,且读取后不...

    Java 验证码识别引擎

    国内第一个绝对高识别率,高效率的Java 验证码识别引擎,推荐使用于自动发贴机、数据采集系统的图片验证码自动识别场合!使用方法:下载解压后,导入Eclipse或MyEclipse中,然后在c:盘下放置一张验证码图片(如:...

    基于Java的贝叶斯图片识别并分类的算法

    基于Java的贝叶斯图片识别并分类的算法,将图片读入后二值化,然后利用贝叶斯算法求在X发生的条件下那个类别发生的概率最大,然后进行分类

    JAVA中SQLlite数据库BLOB数据类型的存取.docx

    JAVA中SQLlite数据库BLOB数据类型的存取.docx

    JAVA一,二维码图片解析识别为数据

    JAVA一,二维码图片解析识别为数据

    java神经网络数字识别

    要用MATLAB分析数据,里面有MATLAB命令。先分离,写入数据后再用MATLAB分析数据,填入w和b就可以切割图片了,最后就是识别图片了。可以识别0~9

    java调用虹软人脸识别

    Java调用虹软人脸识别是一种非常实用的技术,可以应用于很多领域。例如,在安全领域,Java调用虹软人脸识别可以作为门禁系统的一部分,识别员工的面孔并授权访问权限。在金融领域,Java调用虹软人脸识别可以用于身份...

    基于java的一个手写识别小软件

    这是大二初学java时写的一个手写识别小软件。 这里包含了整个程序的源代码,《概要设计说明书》,javadoc 和 UML类图。 Version: 1.0 压缩包中包含了: 1.任务综合报告:概要设计说明书.docx 2.程序源代码文件:...

    Java程序设计基础:环境变量配置.pptx

    指向JDK安装后的根目录,如“ C:\Program files\Java\jdk1.8.0_20”,Eclipse、NetBeans等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。 Path 环境变量 指向Java命令程序所在目录,设置Path后,操作系统...

    百度人脸识别API java调用

    右键项目--》Java Build Path---&gt;Libraries----&gt;点开 JRE System Library[...]---》选中Access rules defined...----》edit----》Add---&gt;选Accessible---&gt;填** 2、 调注册接口 报 {"id":0,"error":{"error_code":...

    java车牌识别停车计费系统.zip

    车牌识别停车计费系统 postgres包是数据安装文件

    配置java环境变量.txt

    3)在path变量(已存在不用新建)添加变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin(注意变量值之间用“;”隔开) 4、“开始”--&gt;“运行”--&gt;输入“javac”--&gt;"Enter",如果能正常打印用法说明配置成功! 补充环境...

    Java+OpenCV+OCR 图像字符处理

    需配置好OpenCV和OCR环境

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java开源包3

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    NB java weka 数据挖掘 机器学习 模式识别 朴素贝叶斯

    NB java weka 数据挖掘 机器学习 模式识别 朴素贝叶斯

    java实现提取图片文字信息并生成表格

    对图片进行水印处理,利用TESS4J识别图片并提取信息生成excel表格。里面有字库文件所以占用空间较大。 说明:https://blog.csdn.net/xlantian/article/details/80789115

    Java 车牌识别

    数字图像处理实际上是利用计算机对图像信息进行加工处理, 以改善图像质量、压缩图像数据或从图像数据中获取更多信息。随着微机、VLSI,DSP 等技术和新的理论、处理方法不断发展,数字图像处理已经成为一门独立的新...

Global site tag (gtag.js) - Google Analytics