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的訪問控制。但是請注意,這樣做可能會破壞封裝性,應該謹慎使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18524.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18524.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18524.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

防止自動化攻擊的最佳實踐

防止自動化攻擊的最佳實踐 在當今的網絡安全環境中&#xff0c;保護用戶賬戶免受自動化攻擊已成為每個網站和應用程序的重要任務。攻擊者可以利用多種不同類型的自動化攻擊來嘗試破壞用戶賬戶。本文將詳細介紹常見的攻擊類型及其防御機制&#xff0c;幫助您更好地保護用戶賬戶…

C# ManualResetEvent的用法

在C#中&#xff0c;ManualResetEvent類是一個同步基元&#xff0c;用于控制多個線程的執行順序。下面是一些ManualResetEvent類的常見用法&#xff1a; 等待一個事件的發生&#xff1a;可以使用ManualResetEvent的WaitOne方法來等待事件的發生。當事件被觸發時&#xff0c;Wait…

adb 連接機頂盒命令

抓機頂盒日志的方法&#xff0c;使用此命令進行抓日志&#xff0c;個別無法抓日志的盒子可以使用此方法 1、安卓9.0版本查詢命令 ps -ef |grep com.cm.webos.iptv 2、安卓4.4版本查詢命令 ps |grep com.cm.webos.iptv 3、查詢順序&#xff1a;首先進入shell下進行操作 adb she…

C++青少年簡明教程:for循環語句

C青少年簡明教程&#xff1a;for循環語句 C的for循環語句是一種迭代控制語句&#xff0c;用于重復執行一段代碼。 語法格式&#xff1a; for(表達式1&#xff1b;表達式2&#xff1b;表達式3) 循環體 for循環語句執行流程圖&#xff1a; 不太好理解&#xff0c;請看下圖&am…

VSCode配置Lua5.4安裝

參考&#xff1a;VSCode 配置 Lua 開發環境(清晰明了)_lua vscode-CSDN博客 1.下載 Lua Binaries Download (sourceforge.net) 2.配置環境變量 解壓放到某文件夾&#xff1a; 環境變量&#xff1a; 3.VSCode安裝插件 4.配置 5.測試

Python | Leetcode Python題解之第116題填充每個節點的下一個右側節點指針

題目&#xff1a; 題解&#xff1a; class Solution:def connect(self, root: Node) -> Node:if not root:return root# 從根節點開始leftmost rootwhile leftmost.left:# 遍歷這一層節點組織成的鏈表&#xff0c;為下一層的節點更新 next 指針head leftmostwhile head:#…

快解析動態域名解析,實現外網訪問內網數據庫

今天跟大家分享一下如何借助快解析動態域名解析&#xff0c;在兩種特定網絡環境下&#xff0c;實現外網訪問內網mysql數據庫。 第1種網絡環境&#xff1a;路由器分配的是動態公網IP&#xff0c;且有路由器登錄管理權限。如何實現外網訪問內網mysql數據庫&#xff1f; 針對這種…

繼承與Object

一.繼承 Java語言的繼承&#xff1a;單繼承 1.類和類之間的關系 (1)組合關系 公司和員工&#xff0c;學校和學生 (2)繼承關系 學生和人 二.Object類 public class Object {private static native void registerNatives();static {registerNatives();} 1.finalize() 對象…

FPGA時鐘:驅動數字邏輯的核心

一、引言 在FPGA&#xff08;現場可編程門陣列&#xff09;設計中&#xff0c;時鐘信號是不可或缺的關鍵要素。時鐘信號作為時序邏輯的心跳&#xff0c;推動著FPGA內部各個存儲單元的數據流轉。無論是實現復雜的邏輯運算還是處理高速數據流&#xff0c;都需要精確的時鐘信號來保…

Vanna使用ollama分析本地MySQL數據庫

上一章節中已經實現了vanna的本地運行&#xff0c;但是大模型和數據庫都還是遠程的&#xff0c;因為也就沒辦法去訓練&#xff0c;這節一起來實現vanna分析本地mysql數據庫&#xff0c;因為要使用本地大模型&#xff0c;所以開始之前需要給本地安裝好大模型&#xff0c;我這里用…

WPF/C#:理解與實現WPF中的MVVM模式

MVVM模式的介紹 MVVM&#xff08;Model-View-ViewModel&#xff09;是一種設計模式&#xff0c;特別適用于WPF&#xff08;Windows Presentation Foundation&#xff09;等XAML-based的應用程序開發。MVVM模式主要包含三個部分&#xff1a;Model&#xff08;模型&#xff09;、…

期權具體怎么交易詳細的操作流程?

期權就是股票&#xff0c;唯一區別標的物上證指數&#xff0c;會看大盤吧&#xff0c;交易兩個方向認購做多&#xff0c;認沽做空&#xff0c;雙向t0交易&#xff0c;期權具體交易流程可以理解選擇方向多和空&#xff0c;選開倉的合約&#xff0c;買入開倉和平倉沒了&#xff0…

【Spring Cloud】API網關

目錄 什么是API網關為什么需要API網關前言問題列表 API網關解決了什么問題常見的網關解決方案NginxLuaSpring Cloud Netflix ZuulSpringCloud Zuul的IO模型弊端 Spring Cloud Gateway 第二代網關——GatewayGateway的特征Spring Cloud Gateway的處理流程Spring Cloud Gateway的…

數據集要點和難點以及具體應用案例

數據集(Data set),又稱為資料集、數據集合或資料集合,是一種由數據所組成的集合。它通常以表格形式出現,其中每一列代表一個特定變量,每一行對應于某一成員的數據集的問題。數據集列出的價值觀為每一個變量,如身高和體重的一個物體或價值的隨機數,每個數值被稱為數據資…

我的又一個神奇的框架——Skins換膚框架

為什么會有換膚的需求 app的換膚&#xff0c;可以降低app用戶的審美疲勞。再好的UI設計&#xff0c;一直不變的話&#xff0c;也會對用戶體驗大打折扣&#xff0c;即使表面上不說&#xff0c;但心里或多或少會有些難受。所以app的界面要適當的改版啊&#xff0c;要不然可難受死…

Android Surface對應的Buffer怎么傳遞給HWC

Android Surface對應的Buffer怎么傳遞給HWC 引言 因為要預研Android Video overlay&#xff0c;需要將SurfaceView對應的GraphicBuffer從drm_hwcomposer中剝離出來&#xff0c;這就需要們了解SurfaceView對應的GraphicBuffer的前世今生&#xff0c;以及它的數據流向以及在各個…

輕兔推薦 —— vfox

簡介 vfox 是一個跨平臺且可擴展的版本管理工具&#xff0c;終于有一個可以管理所有運行環境的工具了 - 支持一鍵安裝 Java、Node.js、Flutter、.Net、Golang、PHP、Python等多種環境 - 支持一鍵切換不同版本 特點 支持Windows(非WSL)、Linux、macOS! 支持不同項目不同版本、…

(四)事件系統

視頻鏈接:尚硅谷2024最新版微信小程序 文章目錄 事件綁定和事件對象事件分類以及阻止事件冒泡事件傳參-data-*自定義數據事件傳參-mark 自定義數據事件綁定和事件對象 小程序中綁定事件與在網頁開發中綁定事件幾乎一致,只不過在小程序不能通過 on 的方式綁定事件,也沒有 cli…

C# 9.0的init訪問器

不控制可變性 下面是我們最常見的屬性聲明方式&#xff0c;允許屬性在類的內部和外部都可以讀取和修改 public int Id { get; set; }namespace Demo {public class Company{public int Id { get; set; }public Company(){}public Company(int id){Id id; // 可以在構造函數中…

22.Volatile原理

文章目錄 Volatile原理1.Volatile語義中的內存屏障1.1.volatile寫操作的內存屏障1.1.1.StoreStore 屏障1.1.2.StoreLoad 屏障 1.2.volatile讀操作的內存屏障1.2.1.LoadStore屏障1.2.2.LoadLoad屏障 2.volatile不具備原子性2.1.原理 Volatile原理 1.Volatile語義中的內存屏障 在…