Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance()

本文主要是介绍Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance()
从java9开始, class.newInstance()已过时, 被加上@Deprecated强烈反对注解

   @SuppressWarnings("removal")@CallerSensitive@Deprecated(since="9")public T newInstance()throws InstantiationException, IllegalAccessException{......}

现用 class.getDeclaredConstructor(Class<?>... parameterTypes).newInstance(Object ... initargs)
步骤:

  1. 获取Class, 如Class.forName("全类名") , 类名.class , 实例.getClass()
  2. getDeclaredConstructor(Class<?>... parameterTypes) 方法, 获取 Constructor<?>
  3. newInstance(Object ... initargs) 方法,获取实例

例如

构造方法无参

Class.forName("全类名").getDeclaredConstructor().newInstance();
Class.forName(Thread.currentThread().getStackTrace()[1].getClassName()).getDeclaredConstructor().newInstance();
try {Class.forName(Thread.currentThread().getStackTrace()[1].getClassName()).getDeclaredConstructor().newInstance();
} catch (InstantiationException e) {e.printStackTrace();
} catch (IllegalAccessException e) {e.printStackTrace();
} catch (IllegalArgumentException e) {e.printStackTrace();
} catch (InvocationTargetException e) {e.printStackTrace();
} catch (NoSuchMethodException e) {e.printStackTrace();
} catch (SecurityException e) {e.printStackTrace();
} catch (ClassNotFoundException e) {e.printStackTrace();
}
try {Class.forName(Thread.currentThread().getStackTrace()[1].getClassName()).getDeclaredConstructor().newInstance();
} catch (Exception e) {	e.printStackTrace();}

有一个String参数的构造方法

Frame frame =(Frame)Class.forName("java.awt.Frame").getDeclaredConstructor(String.class).newInstance("Frame标题");




在这里插入图片描述

一些摘抄

摘抄1

在Java中,你可以使用反射(Reflection)来实例化对象。反射允许程序在运行时查看类的内部结构,如方法、字段等,并可以动态地调用方法或访问字段。

下面是一个使用反射来实例化对象的简单示例:

import java.lang.reflect.Constructor;public class ReflectionExample {public static void main(String[] args) {try {// 获取Class对象,这里我们使用String类作为示例Class<?> clazz = Class.forName("java.lang.String");// 获取构造方法,这里我们获取无参构造方法Constructor<?> constructor = clazz.getDeclaredConstructor();// 由于默认构造方法可能是私有的(在String类的情况下),我们需要设置为可访问constructor.setAccessible(true);// 使用构造方法实例化对象Object obj = constructor.newInstance();// 输出实例化后的对象类型System.out.println("Instantiated object of type: " + obj.getClass().getName());// 注意:对于String类,直接使用构造方法实例化可能不会得到你期望的结果,因为String类内部有缓存机制// 这里只是为了演示反射的使用,通常你不会直接这样实例化String对象} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}
}

注意:

  1. 使用反射时,需要处理多个异常,因为反射操作可能会失败。
  2. 在这个示例中,我们使用了String类作为示例,但通常你不会这样直接实例化String对象,因为String类有自己的缓存机制。
  3. 如果你知道构造方法需要参数,你可以使用getDeclaredConstructor(Class<?>... parameterTypes)方法来获取对应的构造方法,并使用newInstance(Object... initargs)方法来传递参数。
  4. 当你使用反射调用私有方法或访问私有字段时,可能需要使用setAccessible(true)来绕过Java的访问控制。但是请注意,这样做可能会破坏封装性,应该谨慎使用。

这篇关于Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997980

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis