Java中getclass(),.class与instanceof的区别与联系

本文介绍了Java中Object类的getClass方法,可获取实例的类型类,所有类型类都是Class类的实例。还说明了可通过实例的getClass()和类型的.class方法获取类型类。同时对比了getClass()和class()方法,指出它们在获取类型名上等价,但在判断类实例时存在差别,且运行和编译时确定情况不同。

我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。例如,有如下一段代码:

A a = new A();

if(a.getClass()==A.class)

    System.out.println("equal");

else System.out.println("unequal");

结果就是打印出 “equal”。可以看到,对象a是A的一个实例,A某一个类,在if语句中使用a.getClass()返回的结果正是A的类型类,在Java中表示一个特定类型的类型类可以用“类型.class”的方式获得,因为a.getClass()获得是A的类型类,也就是A.class,因此上面的代码执行的结果就是打印出 “equal”。特别注意的是,类型类是一一对应的,父类的类型类和子类的类型类是不同的,因此,假设A是B的子类,那么如下的代码将得到 “unequal”的输出:

A a = new A();

if(a.getClass()==B.class)

    System.out.println("equal");


else System.out.println("unequal");

因此,如果你知道一个实例,那么你可以通过实例的“getClass()”方法获得该对象的类型类,如果你知道一个类型,那么你可以使用“.class”的方法获得该类型的类型类。


联系 

一般情况下,getclass()方法和class()方法是等价的,都可以获得一个类型名,例如下面的代码:

在比较一个类是否和另一个类属于同一个类实例的时候,我们通常可以采用instanceof和getClass两种方法通过两者是否相等来判断,但是两者在判断上面是有差别的,下面从代码中看看区别:

public class Test

{

public static void testInstanceof(Object x)

{

System.out.println("x instanceof Parent: "+(x instanceof Parent));

System.out.println("x instanceof Child: "+(x instanceof Child));

System.out.println("x getClass Parent: "+(x.getClass() == Parent.class));

System.out.println("x getClass Child: "+(x.getClass() == Child.class));

}

public static void main(String[] args) {

testInstanceof(new Parent());

System.out.println("---------------------------");

testInstanceof(new Child());

}

}

class Parent {


}

class Child extends Parent {


}
  1. 输出:

  2. x instanceof Parent: true

  3. x instanceof Child: false

  4. x getClass Parent: true

  5. x getClass Child: false

  6. ---------------------------

  7. x instanceof Parent: true

  8. x instanceof Child: true

  9. x getClass Parent: false

  10. x getClass Child: true

  11. */

从程序输出可以看出,instanceof进行类型检查规则是:你属于该类吗?或者你属于该类的派生类吗?而通过getClass获得类型信息采用==来进行检查是否相等的操作是严格的判断。不会存在继承方面的考虑;

区别

两者最直接的区别就是,getClass()是一个类的实例所具备的方法,而class()方法是一个类的方法。 
另外getClass()是在运行时才确定的,而class()方法是在编译时就确定了。

例如下面的程序:

class A{

public void func(){

}

}


class B extends A{


}

public class Test {

public static void main(String[] args) {

A a = new A();

B b = new B();

A ab = new B();

System.out.println(a.getClass()+" "+A.class);

System.out.println(b.getClass()+" "+B.class);

System.out.println(ab.getClass());

ab = a;

System.out.println(ab.getClass());

}

}

 输出结果为:

  1. class A class A

  2. class B class B

  3. class B

  4. class A

Java 中,获取实体的 `Class` 对象是一种常见操作,通常用于反射、动态创建对象、访问的元数据等场景。以下是几种常用方法来获取实体的 `Class` 对象。 ### 使用字面常量获取 可以通过的字面常量(`.class`)直接获取 `Class` 对象。这种方法适用于已知名且不需要动态加载的情况。 ```java Class<?> clazz = MyEntity.class; ``` ### 使用对象的 getClass() 方法 如果已经有实体的一个实例,可以调用其 `getClass()` 方法获取 `Class` 对象。此方法返回的是运行时的实际。 ```java MyEntity entity = new MyEntity(); Class<?> clazz = entity.getClass(); ``` ### 使用 Class.forName() 方法 如果的全限定名(包括包名)是已知的,可以通过 `Class.forName()` 方法动态加载。这在需要根据配置或运行时输入加载时非常有用。 ```java String className = "com.example.MyEntity"; Class<?> clazz = Class.forName(className); ``` ### 获取泛型型中的实体 Class 对象 在某些情况下,实体型信息可能被封装在泛型中,例如通过反射获取父的泛型参数型。可以通过 `getGenericSuperclass()` 和 `ParameterizedType` 来提取泛型型。 ```java Type genericSuperclass = getClass().getGenericSuperclass(); if (genericSuperclass instanceof ParameterizedType) { Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments(); Class<?> entityClass = (Class<?>) actualTypeArguments[0]; } ``` ### 获取数组型的 Class 对象 如果需要获取实体数组的 `Class` 对象,可以通过 `Class.forName()` 并在名前加上 `[L` 和结尾的 `;` 来表示这是一个对象数组。 ```java String arrayClassName = "[Lcom.example.MyEntity;"; Class<?> arrayClass = Class.forName(arrayClassName); ``` ### 获取基本型数组的 Class 对象 对于基本型数组,例如 `int[]` 或 `double[]`,可以直接使用 `.class` 语法。 ```java Class<?> intArrayClass = int[].class; ``` ### 获取的加载器 通过 `Class` 对象还可以获取加载器(`ClassLoader`),这对于动态加载资源或非常有用。 ```java ClassLoader classLoader = clazz.getClassLoader(); ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值