Java 任意class类型判断及使用场景 getName() getCanonicalName() getSimpleName() getTypeName() isAssignable()

主要使用的方法

任意一个对象 Java 都有它自己的类,例如一般的字符串对象都给与了 String 这个类,而对于定义类 Class 本身也是拥有着自己的类定义和通用的方法。
通过至今的开发经验 类的类型判断可以通过这些方式来做

通过类名
getName()
getCanonicalName()
getSimpleName()
getTypeName()

判断类的继承关系:
isAssignableFrom()

关键字
instanceof

方法讲解以及示例代码

通常使用场景

传统的业务场景并不需要这类代码的书写,但一些内部代码的优化和通用方法的书写可以用到这些写法,例如 我们使用某些框架的时候,框架对不同类型的入参提供了不同的方法,而我们需要通过自己判断入参的类型来调用不同的方法完成业务代码的书写,那么此时我们就可以通过对底层业务类型的判断书写通用的公共方法,使得不论我们传入什么类型的参数,公共方法都可以自己判断调用对应框架的哪个方法来完成业务代码的编写,之后我们只需要维护这个公共方法而无需关心底层业务调用框架的哪一个方法来完成实现,可以节约部分开发时间,提供代码的复用性以及可用性。

代码判断示例

这里先做示例,方法之后进行说明
由于我在 main 方法中执行测试 所以这里 有static
当有 static 时 < T> 需要放 static 后面, 这里 T 可以理解为任意一个类的类型

    private static <T> void judgeClassType(T value){
        if (value != null) {
            String className = value.getClass().getName();

            if (String.class.getName().equals(className)){
                System.out.println(String.class.getName());
            }else if (Long.class.getName().equals(className)){
                System.out.println(Long.class.getName());
            }else if (Date.class.getName().equals(className)){
                System.out.println(Date.class.getName());

                // 集合类判断
            }else if (Collection.class.isAssignableFrom(value.getClass())){
                System.out.println(value.getClass());
            }
        }
    }

在 main 中执行测试代码

    public static void main(String[] args){
        judgeClassType("dwd");
    }

输出:

java.lang.String

结果判断正确,再试试集合类型的
main 测试代码

ArrayList<Object> objects = new ArrayList<>();
judgeClassType(objects);

输出:

class java.util.ArrayList

可以看得出 依旧判断正确

结论

可以看的出,只要判断的是一般的类那么只要保证标红的方法使用一致那么就可以保证类型的判断正确,如果需要判断入参为某一个类的子类那么使用 isAssignableFrom(子类对象.class) 即可
在这里插入图片描述

方法说明

getName()

返回此对象表示的实体(类、接口、数组类、基元类型或void)的名称,
如果该类对象表示不是数组类型的引用类型,则返回该类的二进制名称,
如果该类对象表示基元类型或void,则返回的名称是一个等于对应于基元类型和void 的Java语言关键字
如果此类对象表示数组类,则名称的内部形式由元素类型的名称组成,前面是一个或多个字符,表示数组嵌套的深度。元素类型名称的编码如下:
在这里插入图片描述

类或接口名是上述指定类的二进制名称。
举例
在这里插入图片描述

getCanonicalName()

直译为典型名
返回Java语言规范定义的基础类的规范名称。如果基础类没有规范名称(即是本地或匿名类或其组件类型没有规范名称的数组),则返回null。

getSimpleName()

简单的类名 不包含包路径

源代码中给定的基础类的简单名称。如果基础类是匿名的,则返回空字符串。
数组的简单名称是带有“[]”的组件类型的简单名称。
特别是,组件类型为匿名的数组的简单名称为“[]

getTypeName()

返回此类型名称的信息字符串

看一些列子

    private static <T> void judgeClassType2(T value){
        Class<?> aClass = value.getClass();

        if (value != null) {
            System.out.println("value.getClass().getName() = " + aClass.getName());
            System.out.println("value.getClass().getCanonicalName() = " + aClass.getCanonicalName());
            System.out.println("value.getClass().getSimpleName() = " + aClass.getSimpleName());
            System.out.println("value.getClass().getTypeName() = " + aClass.getTypeName());

            System.out.println("String.class.getName() = " + String.class.getName());
            System.out.println("String.class.getCanonicalName() = " + String.class.getCanonicalName());
            System.out.println("String.class.getSimpleName() = " + String.class.getSimpleName());
            System.out.println("String.class.getTypeName() = " + String.class.getTypeName());

            System.out.println("String.class.getClass() = " + ArrayList.class.getClass());
        }
    }

输出:
其中 BlueBridgeCup 为我自己定义的类的对象作为了该方法的入参

value.getClass().getName() = org.aurora.cw.BlueBridgeCup
value.getClass().getCanonicalName() = org.aurora.cw.BlueBridgeCup
value.getClass().getSimpleName() = BlueBridgeCup
value.getClass().getTypeName() = org.aurora.cw.BlueBridgeCup
String.class.getName() = java.lang.String
String.class.getCanonicalName() = java.lang.String
String.class.getSimpleName() = String
String.class.getTypeName() = java.lang.String
String.class.getClass() = class java.lang.Class
class java.util.ArrayList

再来看一个数组的测试代码:

        System.out.println("new int[1].getClass().getName() = " + new int[1].getClass().getName());
        System.out.println("new int[1].getClass().getCanonicalName() = " + new int[1].getClass().getCanonicalName());
        System.out.println("new int[1].getClass().getTypeName() = " + new int[1].getClass().getTypeName());
        System.out.println("new int[1].getClass().getSimpleName() = " + new int[1].getClass().getSimpleName());

输出:

new int[1].getClass().getName() = [I
new int[1].getClass().getCanonicalName() = int[]
new int[1].getClass().getTypeName() = int[]
new int[1].getClass().getSimpleName() = int[]

isAssignableFrom()

主动调用是某一个指定的类。而这个类作为父类,作为方法的入参 isAssignableFrom() 的入参即为要判断的类
总的功能是判断 作为入参的类是否是父类的子类或实现类。例子上面已经有了就不赘述了。

源码的方法说明
确定此对象表示的类或接口是否与指定的参数表示的类和接口相同,或是其超类或超接口。
如果是,则返回{@code:true};
否则,它将返回{@code false}。
如果此{@code Class}对象表示基元类型,则如果指定的{@code Class}参数正是此{@code Class}对象,则此方法返回{@code true};否则,它返回{@code:false}
具体而言,此方法测试由指定的{@code Class}参数表示的类型是否可以通过标识转换或扩展引用转换转换为由{@code Class}对象表示的类型。

instanceof

关键字并不是方法
用于检测 instanceof 左边的 对象是否可以实例化为 instanceof 右边的类或者接口,即是否在同一树上(是否存在继承或者实现关系)

具体例子见
Java专题 instanceof 学习总结

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值