且构网

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

反射实例化对象 | 带你学《Java语言高级特性》之八十二

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

上一篇:Class类对象的三种实例化模式 | 带你学《Java语言高级特性》之八十一
【本节目标】
通过实际开发中的案例进行程序的说明,来进一步理解反射的核心意义。

经过一系列分析之后可以发现虽然获得了Class类的实例化对象,但是依然觉得这个对象获取的意义不是很大,所以为了进一步理解反射的核心意义,下面将通过几个案例进行程序的说明(都是实际开发中一定会使用到的)。

反射实例化对象

获取Class对象后最大意义实际上并不是在于只是一个对象的实例化操作形式,更重要的是Class类中提供了一个对象的反射实例化方法(代替了关键字new):

在JDK1.9以前的实例化:

@Deprecated(since="9")
public T newInstance() throws InstantiationException, IllegalAccessException

在JDK1.9之后的实例化:

clazz.getDeclaredConstructor().newInstance()

范例:通过newInstance()方法实例化Person类对象

package cn.mldn.vo;
public class Person {
    //任何情况下如果要实例化类对象,一定要调用类中的构造方法
    public Person(){     //无参构造方法
        System.out.println("*********** Person类构造方法 ************");
    }
    @Override
    public String toString() {
        return "我是一个人,一个脱离了低级趣味的好人!";
    }
}
package cn.mldn.demo;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls=Class.forName("cn.mldn.vo.Person");
        Object obj= cls.newInstance();  //实例化对象,JDK1.9后被废除了
        System.out.println(obj);  //输出对象调用toString()方法
        /**
         * *********** Person类构造方法 ************
         * 我是一个人,一个脱离了低级趣味的好人!
         */
    }
}

现在通过反射实现的对象实例化处理,依然要调用类中的无参构造方法,其本质等价于“类 对象 = new 类()”,相当于隐含了关键字new,而直接使用字符串进行了替代。

范例:使用getDeclaredConstructor().newInstance()进行对象实例化

package cn.mldn.demo;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls=Class.forName("cn.mldn.vo.Person");
        Object obj= cls.getDeclaredConstructor().newInstance();  //实例化对象,JDK1.9废除了
        System.out.println(obj);
        /**
         * *********** Person类构造方法 ************
         * 我是一个人,一个脱离了低级趣味的好人!
         */
    }
}

从JDK1.9后,newInstance()被替代了,因为默认的Class类中的newInstance()方法只能调用无参构造,所以很多开发者会认为其描述的不准确,于是将其变换了形式(构造方法会讲解)。

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

下一篇:反射与工厂设计模式 | 带你学《Java语言高级特性》之八十三
更多Java面向对象编程文章查看此处