且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Class类对象的三种实例化模式 | 带你学《Java语言高级特性》之八十一

更新时间:2022-06-07 19:25:14

上一篇:初识反射机制 | 带你学《Java语言高级特性》之八十

【本节目标】
本节需要学会掌握Class类对象的三种实例化模式的方法,在以后的开发过程中都会用到。

Class类对象的三种实例化模式

反射中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类如果要想获取它的实例化对象可以采用三种方式来实现,首先来观察java.lang.Class类的定义:

public final class Class<T> extends Object 
implements Serializable, GenericDeclaration, Type, AnnotatedElement

从JDK1.5开始,Class类在定义的时可以使用泛型进行标记,这样的用法主要是希望可以避免所谓的向下转型。下面通过具体的操作讲解三种实例化形式。
1、【Object类支持】Object类可以根据实例化对象获取Class对象。

public final Class<?> getClass()
class Person{}  //采用自定义的程序类
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Person per = new Person();  //已经存在有指定类的实例化对象
        Class<? extends Person> cls = per.getClass();
        System.out.println(cls.getName());  //获取的是类的完整名称
    }
}

这种方式有一个不是缺点的缺点:如果只是想获得Class类对象,则必须产生指定类对象后才可以获得。

2、【JVM直接支持】采用“类.class”的形式实例化

class Person{}  //采用自定义的程序类

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class<? extends Person> cls=Person.class;
        System.out.println(cls.getName());  //cn.mldn.demo.Person
    }
}

特点:如果想获得Class类对象,就必须导入程序所对应的开发包;

3、【Class类支持】在Class类中提供有一个static方法:

加载类:public static Class<?> forName​(String className)throws ClassNotFoundException

package cn.mldn.vo;
public class Person {

}
package cn.mldn.demo;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");//该类必须存在
        System.out.println(cls.getName()); //cn.mldn.vo.Person
    }
}

这种模式最大的特点:可以直接采用字符串的形式定义要使用的类型,并且程序中不需要编写任何的import语句。
如果此时要使用的程序类不存在则会抛出“java.lang.ClassNotFoundException”异常。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:反射实例化对象 | 带你学《Java语言高级特性》之八十二
更多Java面向对象编程文章查看此处