`

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编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...

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

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

    java条形码识别

    通过ZXing库,Java开发者可以轻松地在各种应用中集成条形码识别功能,提升数据处理的效率和准确性。结合`Barcode.java`的源代码,你可以更好地理解如何在实践中使用ZXing,从而实现你自己的条形码识别系统。

    Java OCR 图像智能字符识别技术,可识别中文

    Java OCR(Optical Character Recognition,光学字符识别)技术是一种计算机视觉领域的应用,它能将图像中的文字转换成可编辑的文本格式。这项技术在各种场景下都有广泛应用,比如文档扫描、车牌识别、发票处理等。...

    识别率很高的java文字识别技术

    Java文字识别技术是一种利用计算机视觉和模式识别原理,将图像中的文字转换为可编辑文本的技术。在Java中实现高识别率的文字识别,通常需要借助外部的OCR(Optical Character Recognition)引擎。tesseract-ocr是一...

    Java 虹膜识别程序 Java 虹膜识别

    项目可能使用了Java的基础类库,以及特定于生物识别的库,如Java Advanced Imaging (JAI) 或OpenCV等,来处理图像数据。 3. **图像处理**:在虹膜识别中,图像处理是非常关键的一环。开发者可能使用了Java的图像...

    java_指纹识别_源码

    Java指纹识别技术是一种生物特征识别技术,它利用人体指纹的唯一性和稳定性来进行个人身份的确认。在本项目中,"java_指纹识别_源码" 提供了一个完整的项目工程源码,适合初学者学习和公司项目直接应用。下面将详细...

    java手写识别超级准确

    Java手写识别技术是一种在Java平台上实现的图像处理与机器学习技术,主要用于识别手写数字或字符。在本项目中,"java手写识别超级准确" 提示我们这是一个高效的识别系统,具有高度的准确率,并且它采用了Swing库来...

    图文识别_java图文识别_java文字识别_

    Java在处理图文识别时,不仅可以识别文字,还可以处理图像中的其他元素,如图表、符号等,这在数据分析、文档自动化等领域非常有用。 总结来说,Java提供了强大的工具和库,使得开发人员能够轻松实现图文识别和文字...

    JAVA智能验证码识别,可训练识别率高

    它可以识别多种语言,并且可以通过训练数据集来提高对特定类型验证码的识别能力。在JAVA中使用Tesseract,开发者需要引入Tesseract的JAVA绑定库,例如tess4j,它可以提供一个简单的API来调用OCR引擎。 JavaCV则是一...

    java调用 人脸识别接口demo

    在本文中,我们将深入探讨如何使用Java调用人脸识别接口,这对于那些正在学习或工作中涉及这一领域的开发者来说是非常有价值的。人脸识别技术已经广泛应用于安全、监控、社交媒体和其他多种场景,而Java作为多平台...

    Java证件自动识别,能快速识别身证信息,行卡信息,驾证信息,行证信息,使用非常方便.zip

    本项目"Java证件自动识别,能快速识别身份证信息,银行卡信息,驾驶证信息,行驶证信息,使用非常方便.zip"提供了一种基于百度文字识别API(OCR)的解决方案。 首先,让我们详细了解一下Java中的证件识别。Java作为...

    车牌识别java代码

    本项目是基于Java语言实现的车牌识别系统,它结合了图像处理和机器学习算法,提供了高效且易于使用的解决方案。 1. **车牌识别的基本流程** - 图像捕获:首先,系统需要获取到包含车牌的图像,这通常通过摄像头或...

    Java OCR 图像智能字符识别-文字识别Demo

    Java OCR(Optical Character Recognition,光学字符识别)技术是一种用于将图像中的文本转换为机器编码文本的方法,尤其在处理纸质文档、扫描件或照片中的文本时非常有用。在这个"Java OCR 图像智能字符识别-文字...

    java身份证自动识别源码

    总之,Java身份证自动识别源码涵盖了图像处理、OCR技术、机器学习模型、数据解析、异常处理、性能优化及安全性等多个方面的知识点,是一套综合性的解决方案。在开发此类系统时,需要综合运用这些知识,以提供高效、...

    java图像运动识别

    Java图像运动识别是一种在计算机视觉领域中的关键技术,它主要用于分析连续的图像序列,检测和跟踪目标物体的运动轨迹。在给定的项目中,通过处理三个连续的图像帧,程序能够确定物体在图像中的移动位置。这个过程...

    java根据卡号识别银行

    在Java编程领域,根据卡号识别银行是一项常见的需求,特别是在金融系统或支付平台的开发中。这个项目包含了一个资源类和一个测试类,用于实现这一功能。资源类通常用来存储和处理与银行卡号相关的数据,而测试类则...

    java-验证码识别-验证码破解

    在这个“java-验证码识别-验证码破解”的主题中,我们将深入探讨如何使用Java进行验证码识别,特别是通过Tess4J库进行OCR(光学字符识别)。 验证码的主要目的是防止自动化的恶意行为,如机器人攻击或垃圾邮件发送...

    java实现人脸识别

    Base64是一种用于在ASCII字符串中表示二进制数据的编码方式,这里的base64字符数据可能包含了预先注册用户的人脸模板。在Java中,我们可以使用`java.util.Base64`类来编码和解码这些数据。 接下来,我们将这些处理...

Global site tag (gtag.js) - Google Analytics