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

简介: 通过实际开发中的案例进行程序的说明,来进一步理解反射的核心意义。

上一篇: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面向对象编程文章查看此处

相关文章
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
73 2
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
29天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
48 4
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
80 3
|
2月前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
28 2
|
2月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
26 0
[Java]反射
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
30 6
|
2月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
55 3