java反射對象賦值_Java反射詳解

反射(Reflection)能夠讓運行于 JVM 中的程序檢測和修改運行時的行為。

Class類提供了以下方法

四個public方法,用于獲取某個類的構造方法:

Constructor getConstructor(Class[] params)

// 根據構造函數的參數,返回一個具體的具有public屬性的構造函數

Constructor getConstructors()

// 返回所有具有public屬性的構造函數數組

Constructor getDeclaredConstructor(Class[] params)

// 根據構造函數的參數,返回一個具體的構造函數(不分public和非public屬性)

Constructor getDeclaredConstructors()

// 返回該類中所有的構造函數數組(不分public和非public屬性)

四種獲取成員方法的方法

Method getMethod(String name, Class[] params)

// 根據方法名和參數,返回一個具體的具有public屬性的方法

Method[] getMethods()

// 返回所有具有public屬性的方法數組

Method getDeclaredMethod(String name, Class[] params)

// 根據方法名和參數,返回一個具體的方法(不分public和非public屬性)

Method[] getDeclaredMethods()

// 返回該類中的所有的方法數組(不分public和非public屬性)

四種獲取成員屬性的方法

Field getField(String name)

// 根據變量名,返回一個具體的具有public屬性的成員變量

Field[] getFields()

// 返回具有public屬性的成員變量的數組

Field getDeclaredField(String name)

// 根據變量名,返回一個成員變量(不分public和非public屬性)

Field[] getDelcaredFields()

// 返回所有成員變量組成的數組(不分public和非public屬性)

getDeclaredFields 和 getFields 的區別:

getDeclaredFields()獲得某個類的所有申明的字段,即包括public、private和proteced,但是不包括父類的申明字段。

getFields()獲得某個類的所有的公共(public)的字段,包括父類。

獲取父類的方法

Class> superclass = class1.getSuperclass() ;

獲取接口

Class>[] interS = class1.getInterfaces() ;

// 獲取所有的接口

實例化

Object object = class1.newInstance() ;

//創建實例化:相當于 new 了一個對象

實例

Person.class

package reflection;

public class Person {

private String id;

private String name;

public String age;

public static String str = "Json";

//構造函數1

public Person() {

System.out.println( "構造函數 無參" );

}

//構造函數2

public Person(String id) {

this.id = id;

System.out.println( "構造函數 id : " + id );

}

//構造函數3

public Person(String id, String name) {

this.id = id;

this.name = name;

System.out.println( "構造函數 id : " + id + " name: " + name );

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

/**

* 靜態方法

*/

public static String update(int id) {

return str+id;

}

}

練習一:通過反射,獲取對象實例,并且操作對象的方法

package reflection;

public class T1 {

public static void main(String[] args) {

try {

//創建類

Class> class1 = Class.forName("reflection.Person");

//創建實例化:相當于 new 了一個對象

Object object = class1.newInstance();

//向下轉型

Person person = (Person) object;

person.setId("100");

person.setName("jack");

System.out.println("id: " + person.getId() + " name: " + person.getName());

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

}

運行結果:

id: 100 name: jack

練習二:通過反射獲取對象字段屬性,并且賦值

package reflection;

import java.lang.reflect.Field;

public class T1 {

public static void main(String[] args) {

try {

//創建類

Class> class1 = Class.forName("reflection.Person");

//創建實例

Object person = class1.newInstance();

//獲得id 屬性

Field idField = class1.getDeclaredField( "id" ) ;

//打破封裝 實際上setAccessible是啟用和禁用訪問安全檢查的開關,并不是為true就能訪問為false就不能訪問

//由于JDK的安全檢查耗時較多.所以通過setAccessible(true)的方式關閉安全檢查就可以達到提升反射速度的目的

idField.setAccessible( true );

//給id 屬性賦值

idField.set(person, "100") ;

//打印 person 的屬性值

System.out.println( idField.get( person ));

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace() ;

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

id 這個屬性的是 private 私有的,不能修改它的值。需要添加 idField.setAccessible( true );

練習三:通過反射操作屬性和方法

package reflection;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class T1 {

public static void main(String[] args) {

try {

//創建類

Class> class1 = Class.forName("reflection.Person");

//創建實例

Object person = class1.newInstance();

//獲得id 屬性

Field idField = class1.getDeclaredField( "id" ) ;

//打破封裝 實際上setAccessible是啟用和禁用訪問安全檢查的開關,并不是為true就能訪問為false就不能訪問

//由于JDK的安全檢查耗時較多.所以通過setAccessible(true)的方式關閉安全檢查就可以達到提升反射速度的目的

idField.setAccessible( true );

//給id 屬性賦值

idField.set( person , "100") ;

//獲取 setName() 方法

Method setName = class1.getDeclaredMethod( "setName", String.class ) ;

//打破封裝

setName.setAccessible( true );

//調用setName 方法。

setName.invoke( person , "jack" ) ;

//獲取name 字段

Field nameField = class1.getDeclaredField( "name" ) ;

//打破封裝

nameField.setAccessible( true );

//打印 person 的 id 屬性值

String id_ = (String) idField.get( person ) ;

System.out.println( "id: " + id_ );

//打印 person 的 name 屬性值

String name_ = ( String)nameField.get( person ) ;

System.out.println( "name: " + name_ );

//獲取 getName 方法

Method getName = class1.getDeclaredMethod( "getName" ) ;

//打破封裝

getName.setAccessible( true );

//執行getName方法,并且接收返回值

String name_2 = (String) getName.invoke( person ) ;

System.out.println( "name2: " + name_2 );

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace() ;

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

運行結果:

id: 100

name: jack

name2: jack

練習四:靜態屬性、靜態方法調用

package reflection;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class T1 {

public static void main(String[] args) {

try {

//創建類

Class> class1 = Class.forName("reflection.Person");

//獲取 nameField 屬性

Field nameField = class1.getDeclaredField( "str" ) ;

//獲取 nameField 的值

String name_ = (String) nameField.get( nameField ) ;

//輸出值

System.out.println( name_ );

//有返回值,有參數

Method getUpdateMethod = class1.getDeclaredMethod( "update" , int.class ) ;

String result_4 = (String) getUpdateMethod.invoke( null , 1 ) ;

System.out.println( "返回值: "+ result_4 );

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace() ;

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

練習五:調用構造函數,創建對象實例

package reflection;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

public class T1 {

public static void main(String[] args) {

try {

//創建類

Class> class1 = Class.forName("reflection.Person");

//無參構造函數

Object object = class1.newInstance() ;

//有參構造函數:一個參數

Constructor> constructor = class1.getDeclaredConstructor( String.class ) ;

constructor.newInstance( "1000" ) ;

//有參構造函數:二個參數

Constructor> constructor2 = class1.getDeclaredConstructor( String.class , String.class ) ;

constructor2.newInstance( "1001" , "jack" ) ;

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace() ;

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

參考文章

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

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

相關文章

Oracle裝置后果

來歷:網海拾貝 本日未來誥日裝置Oracle后,出現了兩個后果。 經過過程SQL Plus不竭無法連接長途數據庫,提醒錯誤ORA-12514:TNS:監聽過程不能解析在連接描繪符中給出的SERVICE_NAME。 厥后締造用可視化的Net Configuration Assistant東西對監聽…

Java Hashtable hashCode()方法及示例

Hashtable類hashCode()方法 (Hashtable Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to return the hash code value for this object in this Hashtable. hashCode()方法…

C---蟬、蜻蜓、蜘蛛

【問題描述】 已知 腿/條翅膀/對蟬61蜻蜓62蜘蛛80 現有小蟲n只,共有X條腿和Y對翅膀,問蟬、蜻蜓、蜘蛛各有多少只?請使用循環的知識解決,數據確保有解。 【輸入形式】三個用空格隔開的整數,依次為n、X、Y 【輸出形式】…

輪廓(查找和繪制輪廓、輪廓的表達與組織、輪廓的特性)

目錄1、輪廓的定義2、如何在圖像中找到輪廓opencv自帶的查找輪廓函數:findContours()3、輪廓的表達方式1.頂點的序列2.Freeman鏈碼4、輪廓之間的組織方式5、輪廓的特點(這部分可以展開來詳細探討,這里不做過多解釋)6、輪廓的匹配7、繪制輪廓d…

python如何操作oracle數據庫_python操作oracle數據庫

搜索熱詞下面是編程之家 jb51.cc 通過網絡收集整理的代碼片段。編程之家小編現在分享給大家,也給大家做個參考。# -*- mode: python; coding: utf-8 -*-## python operate oracle,contain insert、delete、update、select.## author liyulin# date 2014-11-07import…

可能用得上的jquery 插件

Chosen (github) 是一個強大的增強下拉選擇框的插件,支持自定義css樣式。同時你可以使用ajax增加一些回調函數,插件會給hidden input復制,這樣你可以在提交表單的時候獲得正確的值。 Turn.js 是一個 JavaScript 庫,使您的網頁內容…

草根創業回憶錄二: 都選擇的是什么人?

草根創業回憶錄二: 都選擇的是什么人? 前言:選合伙人和投資就像在選女朋友一樣,要謹慎,甚至有時候寧缺毋濫。 曾經以為有了錢,就會找到需要的人,后來發現不是這樣的。 也以為,隨便拉幾個關系好的…

float.equals_Java Float類equals()方法與示例

float.equals浮動類equals()方法 (Float class equals() method) equals() method is available in java.lang package. equals()方法在java.lang包中可用。 equals() method is used to check equality or inequality of this Object against the given Object or in other wo…

01-基本配置與測試

一、開發環境 使用的是Anaconda 3,其中Python版本為3.6.3 首先,在Anaconda下的Scripts文件夾下打開命令框 使用pip install -U selenium安裝selenium 打開Jupiter Notebook,輸入from selenium import webdriver進行測試 不報錯即安裝成功 …

Opencv——查找并繪制凸包、凸包與輪廓的關系

定義 給定二維平面上的點集,凸包就是將最外層的點連接起來構成的凸多邊型。 理解物體形狀或輪廓的一 種比較有用的方法便是計算一個物體的凸包,然后計算其凸缺陷(convexity defects)。 檢測凸包 opencv自帶函數:convexHull() 參數解釋&a…

EF Code First 簡單的示例

一對多&#xff1a; public class Category {public Category(){Id GuidComb.GenerateComb();}public Guid Id { get; set; }public string Name { get; set; }public string Description { get; set; }public virtual IList<Topic> Topics { get; set; } }public class…

線程同步 - 整理

線程同步機制為線程協同工作而設計&#xff0c;windows系統中有多種機制可以用于線程同步&#xff0c;最常用的有下面幾種&#xff1a; 互斥對象(Mutex)時間對象(Event)信號量(Semaphore)臨界區(critical section)可等待計時器(waitable Timer)同步過程中兩個重要的概念是同步對…

智能車復工日記【N】:圖像處理——環島debug記錄(持續更新)

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 Debug記錄 代碼以及思路整理:系列文章4.10號更新5.4號更新5.5號更新代碼以及思路整理: 【智能車Code review】——環島的判…

java接口并發衡量_java 后端設計高并發接口總結

如何設置高并發接口一、并發隊列的選擇二、請求接口的合理設計三、高并發下的數據安全3.1 超發的原因3.2 悲觀鎖思路3.3 FIFO隊列思路3.4 樂觀鎖思路一、并發隊列的選擇Java的并發包提供了三個常用的并發隊列實現&#xff0c;分別是&#xff1a;ArrayBlockingQueue、Concurrent…

兩倍---C++

【問題描述】給定n個不同的正整數&#xff0c;你的任務是計算這些數里面有多少個數對滿足&#xff1a;數對中一個數是另一個數的兩倍&#xff0c;比如給定1 4 3 2 9 7 18 22&#xff0c;得到的答案是3&#xff0c;因為2是1的兩倍&#xff0c;4是2的兩倍&#xff0c;18是9的兩倍…

java bitset_Java BitSet cardinality()方法與示例

java bitsetBitSet類cardinality()方法 (BitSet Class cardinality() method) cardinality() method is available in java.util package. cardinality()方法在java.util包中可用。 cardinality() method is used to return the cardinality (i.e. the number of bits is set t…

LeetCode: Merge k Sorted Lists

自己寫的太復雜了&#xff0c;一開始想的是給開始的lists頭們排序&#xff0c;然后從這個序列的第一個抽出來&#xff0c;然后再重新用二分法進行排序&#xff0c;不過這個方法large超時了&#xff0c;看了網上的發現還是用很土地方法用一個for循環從前兩個開始merge到最后&…

JAVA 取得當前目錄的路徑

在寫java程序時不可避免要獲取文件的路徑...總結一下,遺漏的隨時補上 1.可以在servlet的init方法里 String path getServletContext().getRealPath("/"); 這將獲取web項目的全路徑 例如 :E:/eclipseM9/workspace/tree/ tree是我web項目的根目錄 2.你也可以隨時在任意…

golang mysql curd_Go 語言操作 MySQL 之 CURD 操作

本文轉載于SegmentFault社區作者&#xff1a;Meng小羽MySQL 是目前開發中最常見的關系型數據庫&#xff0c;使用 Go 語言進行操控數據庫需要使用 Go 自帶database/sql和驅動go-sql-driver/mysql來實現。創建好 Go 項目&#xff0c;需要引用驅動依賴&#xff1a;go get -u githu…

02.1-元素定位(find)

常用的一些方法 一、導包 from selenium import webdriver二、打開火狐&#xff08;空白頁&#xff09; b webdriver.Firefox()三、跳轉到指定的網站 b.get(https://www.baidu.com/)四、將瀏覽器頁面最大化 b.maximize_window()五、通過F12可查看當前的貼吧為超鏈接形式 …