Java中的java.lang.Class API 详解

且将新火试新茶,诗酒趁年华。

https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java04.jpg

概述

Class是一个位于java.lang包下面的一个类,在Java中每个类实例都有对应的Class对象。类对象是由Java虚拟机(JVM)自动构造的。

Class类的方法经常在反射时被调用。

创建Class对象

有三种方法可以创建Class对象

  1. Class.forName(“className”):因为Class类没有公共的构造方法,所以存在一个静态的方法返回Class对象,即Class.forName()用于创建Class对象。要创建的Class对象的类名在运行时确定,不存在则抛出ClassNotFoundException。(注意className为类的完整包名)
Class.forName("java.lang.String")
  1. Myclass.class:当我们在类名后面跟上.class时,就会返回当前类的Class对象。它主要应用于原始数据类型,并且仅在我们知道类的名称时才使用。要创建的Class对象的类名在编译时确定
Class c2 = String.class;

请注意,此方法与类名一起使用,而不是与类实例一起使用

A a = new A();   // Class A 的实例a
Class c = A.class; // 正确用法
Class c = a.class; //编译出错
  1. obj.getClass() : 此方法存在时Object类中,它返回此obj对象的运行时类。
String str = new String("string");
Class c3 = str.getClass();

Class对象里面的方法

String toString()

此方法将Class对象转换为字符串。它返回字符串表示形式,即字符串“class”或“interface”,后跟空格,然后是类的含包名名称。如果Class对象表示基本类型,则此方法返回基本类型的名称,如果它表示void,则返回“void”

描述:

语法 :
public String toString()
参数 :
NA
返回 :
a string representation of this class object.
重写 :
toString in class Object

测试类:

public class ToStringTest {
   
    public static void main(String[] args) throws ClassNotFoundException {
   
        Class c1 = Class.forName("java.lang.String");
        Class c2 = int.class;
        Class c3 = void.class;
        System.out.println("Class represented by c1: "+c1.toString());
        System.out.println("Class represented by c2: "+c2.toString());
        System.out.println("Class represented by c3: "+c3.toString());
    }
}

输出:

Class represented by c1: class java.lang.String
Class represented by c2: int
Class represented by c3: void
String toGenericString()

返回描述此类的字符串,包括有关修饰符和类型参数的信息。

描述:

语法 :
public String toGenericString()
参数 :
NA
返回 :
a string describe of this class object.

测试类:

public class ToGenericStringTest {
   
    public static void main(String[] args) throws ClassNotFoundException {
   
        Class c1 = Class.forName("java.lang.String");
        Class c2 = int.class;
        Class c3 = void.class;
        System.out.println("Class represented by c1: "+c1.toGenericString());
        System.out.println("Class represented by c2: "+c2.toGenericString());
        System.out.println("Class represented by c3: "+c3.toGenericString());
    }
}

输出:

Class represented by c1: public final class java.lang.String
Class represented by c2: int
Class represented by c3: void
Class<?> forName(String className)

返回与给定字符串名称的类或接口相关联的 类对象。

描述:

语法 :
public static Class<?> forName(String className) throws ClassNotFoundException
参数 :
className -含包名
返回 :
返回指定包名的class对象
异常:
ClassNotFoundException
......

测试类:

public class ToClassForNameTest {
   
    public static void main(String[] args) throws ClassNotFoundException {
   
        Class c1 = Class.forName("java.lang.String");
    }
}

输出:

Class<?> forName(String className,boolean initialize, ClassLoader loader)

使用给定的类加载器返回与给定字符串名称的类或接口相关联的类对象。如果参数loader为空,则通过引导类加载器加载该类。只有当initialize参数为true并且尚未被初始化时,该类才被初始化。

描述:

语法 :
public static Class<?> forName(String className,boolean initialize, ClassLoader loader)
throws ClassNotFoundException
参数 :
className -含包名
initialize - 如果true该类将被初始化。
loader  - 类加载器
返回 :
返回指定包名的class对象
异常:
ClassNotFoundException
......

测试类:

public class ToClassForNameTest {
   
    public static void main(String[] args) throws ClassNotFoundException {
   
        Class myClass = Class.forName("Test");
        ClassLoader loader = myClass.getClassLoader();
        Class c = Class.forName("java.lang.String",true,loader)
    }
}

输出:

T newInstance()

此方法创建此Class对象表示的类的新实例。通过具有空参数列表的新表达式创建类。如果尚未初始化,则初始化该类。

描述:

语法 :
public T newInstance() throws InstantiationException,IllegalAccessException
参数 :
NA
返回 :
由此对象表示的类的新分配实例
异常:
IllegalAccessException
......

测试类:

public class NewInstanceTest {
   
    public static void main(String[] args) throws ClassNotFoundException {
   
      Class c1 = Class.forName("java.lang.String");
      Object instance = c1.newInstance();
      System.out.println("instance class : " + instance.getClass());
    }
}

输出:

instance class : class java.lang.String
boolean isInstance(Object obj)

此方法确定指定的Object是否与此Class表示的对象分配兼容。它相当于java中的instanceof运算符

描述:

语法 :
public boolean isInstance(Object obj)
参数 :
obj - the object to check
返回 :
true if obj is an instance of this class else return false
异常:

测试类:

public class IsInstanceTest {
   
    public static void main(String[] args) throws ClassNotFoundException {
   
        Class c = Class.forName("java.lang.String");
        String url = "http://niocoder.com";
        int i = 10;
        boolean b1 = c.isInstance(url);
        boolean b2 = c.isInstance(i);
        System.out.println("is url instance of String : " + b1);
        System.out.println("is i instance of String : " + b2);
    }
}

输出:

is url instance of String : true
is i instance of String : false
boolean isAssignableFrom(Class<?> cls)

此方法确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是超类或超接口。

描述:

语法 :
public boolean isAssignableFrom(Class<?
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值