Java的java.lang.reflect.Constructor应用

news/2024/5/19 0:09:47 标签: java, 构造函数, 反射机制, Constructor, spring boot

记录:479

场景java.lang.reflect.Constructor的使用,包括但不限于创建Constructor,使用Constructor创建对象实例,获取类的构造函数上的注解,以及其它常用方式使用。在Java反射机制中发挥重要作用。

版本:JDK 1.8,Spring Boot 2.6.3。

1.基础

1.1Constructor

在JDK的java.lang.reflect.Constructor中对Constructor的官方说明如下:

Constructor provides information about, and access to, a single constructor for a class.

Constructor permits widening conversions to occur when matching the actual parameters to newInstance() with the underlying constructor's formal parameters, but throws an IllegalArgumentException if a narrowing conversion would occur.

1.2Java 反射机制

Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制

2.创建Constructor对象

请注意

(1)Java的Constructor是一个final修饰的类,不可被继承。

(2)Constructor没有public修饰的构造函数,不能使用new关键字创建对象。

(3)使用Class对象获取Constructor对象。

java">//创建Class对象
Class<?> clz01 = ThreadPoolExecutor.class;
//1.使用getConstructor获取类的构造函数
Constructor<?> con01 = clz01.getConstructor(int.class, int.class, long.class, TimeUnit.class, BlockingQueue.class);
//2.使用getConstructors获取类的全部构造函数
Constructor<?>[] cons02 = clz01.getConstructors();
//3.使用getDeclaredConstructor获取类的构造函数
Constructor<?> con03 = clz01.getDeclaredConstructor(int.class, int.class, long.class, TimeUnit.class, BlockingQueue.class);
//4.使用getDeclaredConstructors获取类的全部构造函数
Constructor<?>[] cons04 = clz01.getDeclaredConstructors();
//5.使用getEnclosingConstructor获取类的构造函数(针对局部类和匿名类)
Class<?> clz02 = new FujianProvince().city.getClass();
Constructor<?> cons05 = clz02.getEnclosingConstructor();

3.使用Constructor创建类的实例对象

java">Class<?> clz = ThreadPoolExecutor.class;
Constructor<?> con = clz.getConstructor(int.class, int.class, long.class, TimeUnit.class, BlockingQueue.class);
ThreadPoolExecutor pool = (ThreadPoolExecutor) con.newInstance(10, 10, 10, TimeUnit.MILLISECONDS, new LinkedBlockingDeque(10));

4.使用Constructor获取类构造函数上的注解

java">Constructor<?> conWork = WorkArea.class.getConstructor();
Annotation ann01 = conWork.getAnnotation(ProvinceAno.class);
Annotation[] ann02 = conWork.getAnnotations();
Annotation ann03 = conWork.getDeclaredAnnotation(ProvinceAno.class);
Annotation[] ann04 = conWork.getDeclaredAnnotations();
AnnotatedType ann05 = conWork.getAnnotatedReceiverType();
AnnotatedType ann06 = conWork.getAnnotatedReturnType();
AnnotatedType[] ann07 = conWork.getAnnotatedExceptionTypes();
AnnotatedType[] ann08 = conWork.getAnnotatedParameterTypes();

5.其它常用方法

java">//1.获取构造函数的Class对象
Class<?> clz03 = con01.getDeclaringClass();
//2.获取构造函数名称
String name01 = con01.getName();
//3.获取构造函数的modifiers
int mod01 = con01.getModifiers();
//4.获取参数类型
TypeVariable<? extends Constructor<?>>[] type01 = con01.getTypeParameters();
//5.返回形参的类型的Class对象数组
Class<?>[] clz04 = con01.getParameterTypes();
//6.获取形参数量
int num01 = con01.getParameterCount();
//7.返回形参的类型的Type对象数组
Type[] type02 = con01.getGenericParameterTypes();
//8.返回Class对象数组,表示函数执行时抛出的异常类型
Class<?>[] clz05 = con01.getExceptionTypes();
//9.返回Type对象数组,表示函数执行时抛出的异常类型
Type[] type03 = con01.getGenericExceptionTypes();
//10.构造函数的形式参数是可变参数返回true,否则返回false.
boolean bl01 = con01.isVarArgs();
//11.构造函数的是合成构造返回true,否则返回false.
boolean bl02 = con01.isSynthetic();

6.辅助类

6.1ProvinceAno

java">@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CONSTRUCTOR)
public @interface ProvinceAno {
    //省编码
    String code();
    //省名称
    String value() default "";
}

6.2WorkArea

java">public class WorkArea {
    @ProvinceAno(code = "35",value = "福建")
    public WorkArea(){
        System.out.println("省级行政区");
    }
}

以上,感谢。

2024年2月28日


http://www.niftyadmin.cn/n/5398693.html

相关文章

一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人

一文速览深度伪造检测&#xff08;Detection of Deepfakes&#xff09;&#xff1a;未来技术的守门人 前言一、Deepfakes技术原理卷积神经网络&#xff08;CNN&#xff09;&#xff1a;细致的艺术学徒生成对抗网络&#xff08;GAN&#xff09;&#xff1a;画家与评审的双重角色…

使用 Gradle 版本目录进行依赖管理 - Android

/ 前言 / 在软件开发中&#xff0c;依赖管理是一个至关重要的方面。合理的依赖版本控制有助于确保项目的稳定性、安全性和可维护性。 Gradle版本目录&#xff08;Version Catalogs&#xff09;是 Gradle 构建工具的一个强大功能&#xff0c;它为项目提供了一种集中管理依赖…

Linux: GDB 调试工具

概念&#xff1a; Linux GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的调试工具&#xff0c;用于调试C、C等编程语言的程序。它可以帮助开发人员定位和修复程序中的错误。 GDB 的使用 &#xff1a; 激活和进入工作模式&#xff1a; gdb 需要调试的文件 进入 …

Nginx服务优化与防盗链配置

一.优化Nginx的相关措施 1.优化网页访问速度 &#xff08;1&#xff09;在可重启状态下&#xff0c;为避免同一客户端长时间占用连接&#xff0c;造成资源浪费&#xff0c;可以在http段设置连接超时参数keepalived_timeout实现控制连接访问时间 &#xff08;2&#xff09;当…

深圳智能制造半导体芯片行业源代码防泄密完整解决方案

一、芯片半导体行业防泄密&#xff0c;不能用监控及管控方式来实现&#xff0c;采用管控方式&#xff0c;首先不能主动防御&#xff0c;只能进行事后查询&#xff0c;并且管控方式&#xff0c;不利于嵌入式开发&#xff0c;对于嵌入式开发&#xff0c;不管是采用沙箱隔离或u口禁…

求字符串长度【进阶版】

求字符串长度【进阶版】 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a; 题目描述&#xff1a; 写⼀个函数Strlen&#xff0c;可以求字符串长度&#xff0c;除了函数的形参&#xff0c;函数中不能使用多余的变量。 输⼊一个字符串&#xff08;字符串长度小于等…

GO语言学习笔记(与Java的比较学习)(四)

结构体 一个结构体&#xff08;struct&#xff09;就是一组字段&#xff08;field&#xff09;。 package main ​ import "fmt" ​ type Vertex struct {X intY int } ​ func main() {fmt.Println(Vertex{1, 2}) } 结构体中的字段用 . 访问 package main ​ im…

蚓链数字化生态系统助力企业业务数字化转型

在当今数字化浪潮中&#xff0c;企业数字化转型已成为提升竞争力的关键。蚓链数字化生态系统致力于通过业务和技术的协同推动企业数字化转型&#xff0c;为企业提供了一套系统化的业务数字化解决方案。 业务数字化的第一步是根据企业当前业务分布&#xff0c;划分业务板块&…