1. 程式人生 > >【類反射】類的呼叫(呼叫類中的成員:成員變數、方法、構造方法)

【類反射】類的呼叫(呼叫類中的成員:成員變數、方法、構造方法)

★ 構造類物件

使用構造器新建物件。根據指定的引數型別找到相應的建構函式,傳入相應引數呼叫執行,以建立一個新的物件例項。

程式碼演示:

package cn.hncu.reflect.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

/**
 * 
 * 利用類反射訪問(呼叫)構造器、方法、屬性
 * 
 *@author <a"
[email protected]
">lxd</a> *@version 1.0 2017-4-19 下午6:29:50 *@fileName ReflectOperateObj.java */
public class ReflectOperateObj { /* * 1、通過類反射呼叫構造器 */ @Test public void constructorDemo() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{ Class c=Class.forName("cn.hncu.reflect.test.UserModel2"
); //1.1呼叫空參構造器 Object obj=c.newInstance();//建立此Class的物件所表示的類的一個例項 System.out.println("1:"+obj.toString()); //1.2呼叫指定(非空參)引數型別類表構造器 //類似於:UserModel2 user=new UserModel2("Jack",23); //1.2.1要先獲取對應構造器物件con Class[] parameterTypes=new Class[2];//★1:構造形引數列表★ parameterTypes[0
]=String.class;//★2:引數列表中的第一個引數為String.class★ parameterTypes[1]=int.class;//★3:引數列表中的第二個引數為int.class★ //Class parameterTypes = null;可變引數是一個引數 Constructor con=c.getDeclaredConstructor(parameterTypes);//★4:得到構造器物件con★ 引數列表為:可變引數 Class... parameterTypes //1.2.2 通過con物件進行構造新物件 Object[] initargs=new Object[2];//★6:構造實參列表★ initargs[0]=new String("Jack"); initargs[1]=new Integer(23); Object obj2=con.newInstance(initargs);//★5:呼叫newInstance(Object... initargs)★ System.out.println("2:"+obj2); }

★ 呼叫方法

根據方法名稱執行方法。根據方法名與引數型別匹配指定的方法,傳入相應引數與物件進行呼叫執行。若是靜態方法,則不需傳入具體物件。

程式碼演示:

    /*
     * 2、通過類反射呼叫普通方法
     */
    @Test
    public void methodDemo() throws Exception{
        Class c=Class.forName("cn.hncu.reflect.test.UserModel2");

        //2.1呼叫空參方法,類似於user.toString();
        //★1★先獲取指定方法所對應的Method物件
        Method m=c.getDeclaredMethod("toString", null);//name - 方法名 :parameterTypes - 引數陣列 
        //★2★執行方法---呼叫該method的invoke方法,同時把user以實參形式傳入
        Object user=c.newInstance();//也可以用demo1的非空參構造器new物件
        //UserModel2 user=new UserModel2("Jack", 23);可以方便測試
        Object str=m.invoke(user, null);//★3★得到的實際方法 <=>String str=user.toString();
        System.out.println("1:"+str);

        //2.2呼叫有引數方法 如:sum(int , double)---user.sum(100,12.13)
        //呼叫方式和無參類似
        //★2★構造形參
        Class[] parameterTypes=new Class[2];
        parameterTypes[0]=int.class;
        parameterTypes[1]=double.class;
        //★1★獲取物件
        Method m2=c.getDeclaredMethod("sum", parameterTypes);
        //★3★之行方法呼叫實參
        Object resObj=m2.invoke(c.newInstance(), new Object[]{23,100.12} );//obj - 從中呼叫底層方法的物件      args - 用於方法呼叫的引數 
        System.out.println("2:"+resObj);

        //2.3呼叫靜態方法
        Method m3=c.getDeclaredMethod("abc", null);
        m3.invoke(c.newInstance(), null);//void
    }

★ 獲取與設定屬性值

根據屬性名稱讀取與修改屬性的值,訪問非靜態屬性需傳入物件為引數。

程式碼演示:

    /*
     * 3、通過類反射呼叫屬性(成員變數)
     */
    @Test
    public void fieldDemo() throws Exception{
        Class c=Class.forName("cn.hncu.reflect.test.UserModel2");
        //3.1 訪問靜態變數
        Field fld=c.getField("MAX");
        fld.set(null, 222);//給靜態變數設定值
        Object v1=fld.get(null);//讀取靜態變數中的值
        System.out.println("1:"+v1);

        //3.2 訪問非靜態變數---可以使用get(),也可以使用基本資料型別專用的get方法 如getDouble()
        Field fld2=c.getField("value");
        Object v2=fld2.get(c.newInstance());//這種get方法可以不需要知道其資料型別是什麼
        System.out.println("v2:"+v2);

    }

暴力訪問所有成員:

程式碼演示:

    /*
     * 4、暴力訪問
     */
    @Test
    public void violenceDemo() throws Exception{
        Class c=Class.forName("cn.hncu.reflect.test.UserModel2");
        Method m=c.getDeclaredMethod("psum", new Class[]{int.class,double.class,float.class});
        m.setAccessible(true);//開啟暴力訪問門 該方法是AccessibleObject類中的,後者是Field、Method、Constructor的共同父類,因此都可以採用這一句開啟暴力訪問開關。
        Object resStr=m.invoke(c.newInstance(), new Object[]{23,2.1,12f});
        System.out.println(resStr);

    }

}

相關推薦

CodeForces - 144DMissile Silos單源最短路,列舉中間邊,列舉情況可能性

題幹: A country called Berland consists of n cities, numbered with integer numbers from 1to n. Some of them are connected by bid

HDU - 2376Average distance 樹上任意兩點之間的距離之和的平均值計算結點的貢獻度

Given a tree, calculate the average distance between two vertices in the tree. For example, the average distance between two vertices in the followi

關於anaconda 找包,安裝包的一些總結關於AnacondaPackageNotFoundError '' Package missing in current win-64 channe

 一、Anaconda作為一個工具包整合管理工具,下載python工具包是很方便的,直接敲: conda install package_name 但是有時候安裝一個工具包(如xmltodict)的時候,在當前的channels中找不到這個包,會提示: conda i

反射呼叫呼叫成員成員變數方法構造方法

★ 構造類物件 使用構造器新建物件。根據指定的引數型別找到相應的建構函式,傳入相應引數呼叫執行,以建立一個新的物件例項。 程式碼演示: package cn.hncu.reflect.t

java反射Class型的相關操作演練

div gif display 演練 esp arguments 接口 hid col 【一】獲取範型接口的實現類的範型類型 (1)範型接口 package org.springframework.context; import java.util.EventList

CF960GBandit Blues第一斯特林數,FFT

【CF960G】Bandit Blues(第一類斯特林數,FFT) 題面 洛谷 CF 求字首最大值有\(a\)個,字尾最大值有\(b\)個的長度為\(n\)的排列個數。 題解 完完全全就是【FJOI】建築師的加強版本。 顯然每一個字首最大值和一段連續的區間構成了一個環排列,顯然每個字首最大值就是這個環

機器學習神經網路——多分類問題

一、問題引入 早在監督學習中我們已經使用Logistic迴歸很好地解決二類分類問題。但現實生活中,更多的是多類分類問題(比如識別10個手寫數字)。本文引入神經網路模型解決多類分類問題。 二、神經網路模型介紹 神經網路模型是一個非常強大的模型,起源於嘗試讓機

機器學習人像識別——K-Means聚

簡介   K-Means聚類是一種非監督的聚類方式,原理參看資料探勘十大演算法 | k-means。    程式碼 import sys import random import numpy as np from sklearn.decomposit

Unity教程淺談Unity呼叫其他指令碼函式的方法未完

第一種,被呼叫指令碼函式為static型別,呼叫時直接用  指令碼名.函式名() 這種就是單例,簡單的單例的使用 如果程式碼過多,程式碼之間相互呼叫單例,每一次呼叫就會生成一個單例,如果程式碼過多, 就不方便程式碼的維護,造成程式效能的重要流失,因此不建議依賴使用單例 使用這種方法,必須在類的前面新增關鍵字

請賀老師幫我看看這個亂碼問題任務2分別定義Teacher(教師)和Cadre幹部,採用多重繼承方式由這兩個派生出新Teacher_Cadre

【任務2】(教材P394習題9)分別定義Teacher(教師)類和Cadre(幹部)類,採用多重繼承方式由這兩個類派生出新類Teacher_Cadre(教師兼幹部)。要求: (1)在兩個基類中都包含姓名、年齡、性別、地址、電話等資料成員。 (2)在Teacher類中還包

個人筆記《知了堂》MySQL的數據

屬性 med mysql 表示 time align mes fault key MySQL中的數據類型 1、整型 MySQL數據類型 含義(有符號) tinyint(m) 1個字節 範圍(-128~127) smallint(m)

Java基礎Java基本數據型與位運算

右移 數據 bits 類型 span 網上 height 使用 常數 1.賦值運算符 賦值使用操作符“=”。它的意思是“取右邊的值(即右值),把它復制給左邊(即左值)”。右值可以是任何 常數、變量或者表達式 (只要它能 生成

資料庫筆記編寫JDBC的工具

註冊驅動和資料庫連線是固定操作,何不將這些固定操作封裝成一個類,並且提供靜態方法返回資料庫連線物件,達到程式碼的重複利用: /* * JDBC的工具類 * 用於註冊驅動,連線資料庫 */ import java.sql.Connection; import java.sql.Drive

TP5.1建立通用的基自定義命令

author:咔咔 wechat:fangkangfk   在之前我們一直在做admin下的業務,在設定自定義模板的時候沒有考慮到一些情況   下面我們來改動一下 這樣做就ok了,不管是建立admin下的控制器,還是index的控制器,這一個模板就可以

NOJ1006演算法實驗二回溯演算法堡壘問題_方格資料表示方法

1006.堡壘問題 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 城堡是一個4×4的方格,為了保衛城堡,現需要在某些格子裡修建一些堡壘。城堡中的某些格子是牆,其餘格子都是空格,堡壘只能建在空格里,每個堡壘都可以向上下左右四個方向射擊,如

關於子和父之間的方法構造方法呼叫關係

子類繼承了父類之後,父類的所有方法都可以被子類呼叫,父類的所有(除私有外)方法都可以被重寫; 但是父類中私有資料域不能在子類中被修改,只能通過呼叫父類的公共修改方法來修改; 例如下面圓幾何繼承了簡單幾何: 以上幾點說明: 簡單幾何類中的構造方法其實不需要寫,因

第十三週任務二Animal設計為抽象,每一個Animal的派生都有一個“名字”資料成員

【任務2】下面給出了基類Animal和main()函式。 (任務2.1)根據main()函式給出的註釋提示,設計出相關的各個類。 (任務2.2)顯然,Animal設計為抽象類更合適,Animal不需要能夠例項化,是專門作基類使用的。改造程式,使Animal設計為抽象類,這時

程式語言C++繼承和派生虛基

從已有的物件型別出發建立一種新的物件型別,使它部分或全部繼承原物件的特點和功能,這是面向物件設計方法中的基本特性之一。繼承不僅簡化了程式設計方法,顯著提高了軟體的重用性,而且還使得軟體更加容易維護。派生則是繼承的直接產物,它通過繼承已有的一個或多個類來產生一個新的類,通過派生

Spring學習Spring JdbcTemplate之五方法總結

自定義函式回撥:1、params:用於描述自定義函式佔位符引數或命名引數型別;SqlParameter用於描述IN型別引數、SqlOutParameter用於描述OUT型別引數、SqlInOutParameter用於描述INOUT型別引數、SqlReturnResultSet用於描述呼叫儲存過程或自定義函式返

三層無法直接啟動帶有“庫輸出型別”的專案

發現問題 在學習三層過程中,遇到了一個這樣子的問題: 無法直接啟動帶有‘類庫輸出型別’的專案            分析問題 錯誤提示上寫的比較清楚了,專案的啟動項是一個類庫輸出專案,一個純粹的類庫專案是無法直接執行的。