【JAVA基礎篇】反射

一、反射的概念

是指在運行過程中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用這個對象的所有方法和屬性。這種動態獲取信息和動態調用方法的功能稱為JAVA的反射機制。

二、反射的優缺點

2.1、優點

通過反射的概念我們已經知道反射的優點是:使程序能夠訪問到裝載到JVM中的類的內部信息(成員變量和成員方法)

2.2、缺點

性能問題:反射是一種解釋操作,通過反射來訪問字段和調用方法時要慢于直接代碼

使用反射會模糊程序內部邏輯:反射繞過了源代碼,使用反射后開發人員無法通過查看源代碼來判斷業務邏輯,會帶來維護問題。使用反射往往比直接代碼更復雜。

ps:Java反射機制主要應用在對靈活性和擴展性要求很高的系統框架上,普通程序不建議使用。

三、反射的使用

3.1、使用反射API來實例化對象

第一步獲取Class實例,有三種方式

Class.forName(是不是很熟悉,JDBC通常通過此方式來獲取數據庫連接驅動類)

.class

getClass()

第二步使用Class的方法來實例化對象,有兩種方式

第一種方式newInstance()

第二種方式

Constructor constructor = clazz.getConstructor();
constructor.newInstance();

話不多說,趕緊上代碼

package com.cc.reflect.bean;public class Student
{private int id;private String name;@Overridepublic String toString(){return "Student [id=" + id + ", name=" + name + "]";}
}
package com.cc.reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;import com.cc.reflect.bean.Student;/*** * @描述: 使用反射API來實例化對象* @版權: Copyright (c) 2019 * @作者: 程沖* @版本: 1.0 * @創建日期: 2019年5月17日 * @創建時間: 上午8:35:04*/
public class InstanceStudent
{public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException{//1 第一步獲取Class實例
//        Class clazz = getClassByFullName("com.cc.reflect.bean.Student");//適用于知道類的完整路徑名Class clazz = getClassByName();//適用于編譯前就明確要操作的類
//        Student student = new Student();Class clazz = getClassByObject(student);//適用于存在可以操作的實例//2 第二步使用Class的方法來實例化對象
//        Object obj = getInstance1(clazz);//直接通過字節碼文件來實例化對象,必須有無參構造器Object obj = getInstance2(clazz);//通過構造對象來實例化對象//3 第三步對象初始化Field fieldId = clazz.getDeclaredField("id");fieldId.setAccessible(true);fieldId.set(obj, 1);Field fieldName = clazz.getDeclaredField("name");fieldName.setAccessible(true);fieldName.set(obj, "張三");//上面的方法破壞了類成員的訪問規則,一般不建議這么做System.out.println(obj);}private static Class getClassByFullName(String fullName) throws ClassNotFoundException{return Class.forName(fullName);}private static Class getClassByName(){return Student.class;}private static Class getClassByObject(Object obj){return obj.getClass();}private static Object getInstance1(Class clazz) throws InstantiationException, IllegalAccessException{return clazz.newInstance();}private static Object getInstance2(Class clazz) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{Constructor constructor = clazz.getConstructor();return constructor.newInstance();}
}

ps:本文只介紹了使用反射來實例化對象,有興趣可以自己去研究一下如何訪問類的屬性、調用類的方法,比較簡單。

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

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

相關文章

在線工具

分享一下很實用的在線工具 在線HTTP接口測試 草料二維碼 站長之家

【JAVA基礎篇】面對對象的特征

面對對象的3大特征是:封裝、繼承和多態 封裝 封裝就是將客觀的事物封裝成抽象的類,這個類包含這類事物共同的特性和行為,特性對應類的成員變量,行為對應類的成員方法。 封裝就是將一批具有相同特性和行為的客觀事物封裝成抽象類…

【JAVA基礎篇】final、finally和finalize

final final表示最終的、不可被更改的,用來修飾類、成員方法和變量,通常處于兩方面的考慮來使用它:特殊的設計和效率。 final類 一個類如果確信沒有子類或者這個類的方法不允許修改,那么就把這個類定義成final類。 final類的成…

【JAVA基礎篇】抽象類和接口的區別

抽象類和接口是定義抽象概念的兩種方式,正是由于抽象類和接口,才賦予了Java強大的面向對象的能力。在討論他們的不同點之前,我們先來了解抽象類和接口。 抽象類 在面向對象的領域一切事物都是對象。對象都是通過類來描述的,但是反…

Oracle常用函數總結

Oracle函數,當任意一個參數為空字符串或者null時,結果返回null 聚合函數 count 使用方式有5種 select count(*) from student;--統計總行數 select count(0) from student;--統計總行數,括號里面的0表示什么意思? select count(id) from …

【JAVA基礎篇】==、equals和hashCode的區別和聯系

作用:比較兩個操作數的關系,返回一個boolean類型的結果 具體含義:如果兩個操作數是基本數據類型,比較值是否相等。如果兩個操作數是引用類型,那么比較的是內存地址是否相同。 equals Object類的實例方法&#xff0c…

【JAVA基礎篇】內部類

定義在一個類內部的類稱為內部類。內部類訪問權限可以是public、protected、default或private,可以聲明為abstract供其他內部類或外部類繼承,可以聲明為static、final,也可以實現特定的接口。外部類可以訪問內部類的所有方法與屬性&#xff0…

【JAVA基礎篇】訪問權限

所謂訪問權限,指的是本類的成員變量、成員方法和內部類對其他類的可見性。 四種訪問權限 Java一共有四種訪問權限,按照權限由大到小分別為public、protected、default和private,如果省略了訪問修飾符,那訪問權限就是defualt。四…

Oracle存儲過程

什么是存儲過程 存儲過程是一組為了完成特定功能的SQL語句,經編譯后存在數據庫,存儲過程是數據庫中的一個重要對象。 ps:有人說:任何一個設計良好的數據庫應用程序都應該用到存儲過程,我覺得這個不一定,其實很多互聯…

解決debug JDK source無法查看局部變量的問題

首先進入傳送門:https://blog.csdn.net/majian_1987/article/details/51273609 進行上面的操作之后,這個時候我們來debug一下jdk源碼,發現可以查看局部變量。但是這時候又發現一個問題,在我自己的代碼里按住ctrl鼠標左鍵單擊無法…

【JAVA基礎篇】多線程

學習Java的多線程知識之前,我們先來了解一下進程和線程的概念,以及他們之間的關系。 進程 基本概念 進程是具有獨立功能的程序在某個數據集合上的一次執行過程。 特點 進程是操作系統進行資源分配的基本單位。每個進程都有自己的地址空間&#xff0…

配置JAVA開發環境

1、首先去Oracle官方網站下載所需版本的JDKhttp://java.sun.com/products/archive/,然后安裝,其實只需要安裝jdk就可以了,不需要安裝jre 2、按照后配置環境變量JAVA_HOME 然后在path最前面添加%JAVA_HOME%\bin; 3、cmd中輸入java -version,提…

【JAVA基礎篇】枚舉

/*** 一組相同類型的常量的集合* author cc**/ public class EnumDemo {public static void main(String[] args) {//遍歷for(WorkDay workDay:WorkDay.values()){System.out.println("序號:"workDay.ordinal());//ordinal,返回枚舉常量的序號…

【JAVA基礎篇】集合框架

一、集合框架圖 Java集合框架主要包含兩種類型的容器,一是集合(Collection),存儲元素集合,二是圖(Map),存儲鍵(key)-值(value)對.Collection接口下面有兩個重要的子接口List和Set,再下面是一些抽象類,最后是…

【JAVA基礎篇】對象初始化過程

我們都知道,創建對象是由 new關鍵字調用構造方法 返回類實例(實際上還可以通過反射來創建實例)。 例如 : Person jack new Person(); 這句話到底做了什么事情呢 ? 其實就是講對象的初始化過程。 1、 new 用到了Person.class,所…

【Java基礎篇】try catch finally語句包含return語句時的執行過程

網上有很多人探討Java中異常捕獲機制try…catch…finally塊中的finally語句是不是一定會被執行? 很多人都說不是,當然他們的回答是正確的,經過我試驗,至少有兩種情況下finally語句是不會被 try語句沒有被執行到,如在…

eclipse指定JDK版本啟動,解決version XXX of the JVM is not suitable for this product.Version:XXX 問題

問題描述:啟動eclipse時,提示version 1.7.0 of the JVM is not suitable for this product.Version:1.8 or greater is required. 原因分析:原因是我的筆記本安裝了多個JDK版本,但是現在我的JAVA_HOME配置的是jdk1.7的路徑&#x…

【JAVA基礎篇】Socket編程

一、Socket的概念 Socket是一種通訊機制,通常稱為套接字。英文原意是插座,顧明思義,Socket像是一個多孔插座,可以提供多個端口的連接服務 ps:至于socket在計算機術語中怎么就翻譯成了“套接字”這個令人費解的詞,這真…

【JAVA基礎篇】注解

一、什么是注解? 注解是元數據,所謂元數據就是描述數據的數據。 在annotation誕生之前(jdk1.5誕生了注解),甚至之后,xml被廣泛的由于描述元數據。但是后來,有一些應用開發工程師和架構師覺得它…

【JAVA基礎篇】IO流

一、流的概念 “對語言設計人員來說,創建好的輸入/輸出系統是一項特別困難的任務。” ――《Think in Java》 無論是系統、還是語言的設計中IO的設計都是異常復雜的。面臨的最大的挑戰一般是如何覆蓋所有可能的因素,我們不僅僅要考慮文件、…