Java注解和反射——动态创建对象执行方法

· 创建类的对象:调用Class对象的newInstanc()方法

  1. 类必须有一个无参构造器。

  2. 类的构造器的访问权限需要足够。

没有无参构造器也可以创建对象。只要在操作的时候明确的调用类中的构造器,并将参数传递进去之后,才可以实例化操作。步骤如下:

  1. 通过Class类的getDeclaredConstructor(Class ... parameterTypes)取得本类的指定形参类型的构造器

  2. 向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数

  3. 通过Constructor实例化对象


 调用指定的方法:

通过反射,调用类中的方法。通过Method类完成。

1. 通过Class类的getMethod(String name,Class ... parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。

2. 之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。 

Object invoke(Object obj,Object[] ... args)

  · Object对应原方法的返回值,若原方法无返回值,此时返回null

  · 若原方法为静态方法,此时形参Object obj可为null

  · 若原方法形参列表为空,则Object[] args为null

  · 若原方法声明为private,则需要在调用此invoke()方法前,显式调用方法对象的setAccessible(true)方法,将可访问private的方法 


代码演示:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;//动态的创建对象,通过反射
public class Test08 {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {//获得Class对象Class<?> c1 = Class.forName("reflection.User");//构造一个对象//User user = (User) c1.newInstance();  //本质上是调用了类的无参构造器//System.out.println(user);//通过构造器创建对象//Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);//User user2 = (User) constructor.newInstance("辰阳", 001, 18);//System.out.println(user2);//通过反射调用普通方法User user3 = (User) c1.newInstance();//通过反射获取一个方法Method setName = c1.getDeclaredMethod("setName", String.class);//invoke:激活//(对象,“方法的值”)setName.invoke(user3,"辰阳");System.out.println(user3.getName());//通过反射操作属性System.out.println("==============================");User user4 = (User) c1.newInstance();Field name = c1.getDeclaredField("name");//不能直接操作私有属性,我们需要关闭程序的安全检测,关闭方法:属性或者方法的setAccessible(true)name.setAccessible(true);  name.set(user4,"辰阳2");System.out.println(user4.getName());}
}

setAccessible

· Method和Field、Constructor对象都有setAccessible()方法。

· setAccessible作用是启动和禁止访问安全检查的开关。

· 参数值为true则指示反射的对象在使用时应该取消Java语言访问检查。

    1. 提高反射效率。如果代码中必须使用反射,而该句代码需要频繁的被调用,那么请设置true

    2. 使得原本无法访问的私有成员也可以访问

· 参数值为false则指示反射的对象应该实施Java语言访问检查 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARMv8/ARMv9 硬件加速系列 1 -- SVE | NEON | SIMD | VFP | MVE | MPE 基础介绍】

文章目录 ARM 扩展功能介绍VFP (Vector Floating Point)SIMD (Single Instruction, Multiple Data)NEONSVE (Scalable Vector Extension)SME (Scalable Matrix Extension)CME (Compute Matrix Engine)MVE (M-profile Vector Extension)MPE (Media Processing Engine)总结 ARM 扩…

嵌入式学习记录6.13(qt day1)

一.思维导图 二.练习&#xff08;简单模拟tim界面&#xff09; 2.1代码 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("Tim");this->setWindowIcon(QIcon("C:\\Users\\zy\…

语言中 函数用地址传参的好处

在C语言中&#xff0c;使用地址传参&#xff08;传递指针&#xff09;有以下几个好处&#xff1a; 1. **减少内存开销**&#xff1a; - 传递一个指针&#xff08;通常是一个地址&#xff09;比传递一个大的结构体或数组要高效得多&#xff0c;因为指针通常是一个固定大小&a…

微信小程序-uniapp-切换tab时数据列表如何切换?

如图&#xff1a; 这里有两个tab&#xff0c;要保证每次切换后列表保持不变&#xff0c;就必须在运行时要有两个持久化的数据源&#xff0c;每个tab是一个列表&#xff0c;让我们来设计一下这样的数据结构。 首先我们的数据结构是这样的&#xff1a; 体现在vue的data是这样的&a…

创建环境并安装包

创建环境 conda create --name py38 python3.8进入环境 conda activate py38退出环境 conda deactivate安装包 代码中如果有大量的包&#xff0c;换服务器时&#xff0c;就需要重新安装各种包&#xff0c;有没有方法可以自动识别代码中的包&#xff0c;然后一起安装 1.安装…

Qt多线程之moveToThread()函数

文章目录 一、moveToThread()执行后&#xff0c;当前代码线程没有改变。二、对象执行moveToThread()后&#xff0c;哪些成员加入了子线程1、创建对象时不指定父对象2、对属性对象使用moveToThread加入子线程作用域3、将属性对象的创建放到子线程中执行 三、C内存模型 在使用“继…

ollama系统更改模型存放位置

1.windows 设置完后可以在cmd中检查一下&#xff1a;echo %ollama_models% 2.linux 首先第一步&#xff1a;cd /etc/systemd/system/ 打开配置文件vim ollama.service 第二步&#xff1a;目录下的environment里面分号隔开添加OLLAMA_MODELS环境变量 第三步&#xff1a;source …

【Kadane】Leetcode 918. 环形子数组的最大和【中等】

环形子数组的最大和 给定一个长度为 n 的环形整数数组 nums &#xff0c;返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c; nums[i] 的下一个元素是 nums[(i 1) % n] &#xff0c;nums[i] 的前一个元素是 nums…

工作组局域网-ARP欺骗-攻击防御单双向

免责声明:本文仅做技术交流与学习... 目录 断网限制-单向 环境: 演示: win10: 欺骗前 欺骗后 kali: kali执行命令: win10结果: 劫持数据-双向 欺骗&#xff1a; 网络分析&#xff1a; 防御--动态解析改静态 中间人攻击 断网限制-单向 环境: 靶机:win10 攻击机:kali…

威胁情报多场景下的实战技术落地

传统的威胁情报狩猎存在覆盖率低、部署难、滞后性、效率低等多种问题&#xff0c;部分APT组织还会针对网络安全设备漏洞进行攻击。知道创宇APT威胁情报团队负责人代皓表示&#xff1a;除基础的测绘数据外&#xff0c;还可以通过定向测绘、主动测绘的手段&#xff0c;掌握多个资…

硬件电路基础

说起来在华北理工大学某个实验室当了快一年的硬件部部长&#xff0c;但是能力水平还是在单片机编程和应用层面&#xff08;虽然也很牛逼了&#xff0c;但是我不介意让我更牛逼一点&#xff09;。对于硬件电路的基础还不是很够。在b站偶尔刷到了我们学校隔壁电协一个学长的毕业视…

抖某音号解封释放实名

##抖音账号封禁后如何解封呢 我相信&#xff0c;做过抖音&#xff0c;或者正在做抖音的朋友&#xff0c;都曾面临一种尴尬至极的局面&#xff0c;辛辛苦苦做起来的账号&#xff0c;或者刚刚准备好的账号&#xff0c;在一时之间&#xff0c;竟然被抖音官方封禁了&#xff01; 实…

Java项目:110 springboot夕阳红公寓管理系统的设计与实现

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统有管理员&#xff0c;租客 管理员权限操作的功能包括对租客&#xff0c;访客&#xff0c;缴费&#xff0c;维修&#xff0c;留言&#xff0c;公…

OpenCV学习(4.11) OpenCV中的图像转换

1. 目标 在本节中&#xff0c;我们将学习 使用OpenCV查找图像的傅立叶变换利用Numpy中可用的FFT功能傅立叶变换的一些应用我们将看到以下函数&#xff1a;**cv.dft()** &#xff0c;**cv.idft()** 等 理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像&#xff0c;使用…

CoppeliaSim机器人模拟器与Matlab Simulink环境

一、CoppeliaSim机器人模拟器 CoppeliaSim&#xff08;原名V-REP&#xff0c;Virtual Robot Experimentation Platform&#xff09;是一款基于物理引擎的动力学机器人模拟器。它提供了一个集成的开发环境&#xff0c;支持传感器、机械、机器人、环境的系统建模与仿真。Coppeli…

【第9章】“基础工作流”怎么用?(图生图/局部重绘/VAE/更多基础工作流)ComfyUI基础入门教程

🎁引言 学到这里,大家是不是会比较纠结,好像还在持续学习新的东西,未来还有多少基础的东西要学习,才能正常使用ComfyUI呢? 这其实需要转变一个心态。 AI绘画还处于一个快速迭代的过程,隔三岔五的就会有很多新技术、新模型出现,ComfyUI目前同样处于一个快速更新的阶…

vue3之toRefs

import { reactive, toRefs } from vue;export default {setup() {// 创建一个响应式对象const state reactive({count: 0,name: Vue 3});// 使用toRefs将响应式对象的属性转换为响应式引用const refs toRefs(state);// 返回响应式引用&#xff0c;以便在模板中使用return {.…

白嫖 kimi 接口 api

说明:kimi当然是免费使用的人工智能AI,但是要调用api是收费的. 项目&#xff1a; https://github.com/LLM-Red-Team/kimi-free-api 原文地址: https://blog.taoshuge.eu.org/p/272/ railway部署 步骤: 打开Github,新建仓库新建名为Dockerfile文件&#xff08;没有后缀&…

C#异步编程是怎么回事

首先以一个例子开始 我说明一下这个例子。 这是一个演示异步编程的例子。 输入job [name],在一个同步的Main方法中,以一发即忘的方式调用异步方法StartJob()。输入time,调用同步方法PrintCurrentTime()输出时间。输出都带上线程ID,便于观察。 可以看到,主线程不会阻塞。主…

RunMe_About PreparationForDellBiosWUTTest

:: ***************************************************************************************************************************************************************** :: 20240613 :: 该脚本可以用作BIOS WU测试前的准备工作,包括&#xff1a;自动检测"C:\DellB…