1. 程式人生 > >java構造方法、成員變數、方法所對應的反射例項

java構造方法、成員變數、方法所對應的反射例項

最原始的class類中包含著一些構造器,包,方法,屬性等等內容,我們可以通過位元組碼檔案得到對應的一個構造器

,並指明是那種構造器通過引數進行設定,然後通過Constructior類進行例項物件

package test;

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

/**
 * @author Dqd
 * 構造方法的反射 Constructor類
 * 成員變數的反射 Field類
 * 方法的反射 Method類
 * 通過反射的方式呼叫main方法
 * 
 */

public class test {

	public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException  {
		
		//構造方法的反射,通常通過類得到構造器然後通過newInstance()來建立例項
		Constructor<?>[] con = stu.class.getConstructors();
		stu st1 = (stu)con[0].newInstance(3,4);
		
		//通過getField來得到可以訪問的變數,然後Field變數對應到相應的實力上取出對應值
		//如果我們通過st1.getClass().getField("x"),因為X為私有所以不能訪問但是可以通過DeclaredField訪問
		//尚若檢視需要用到包級反射,修改許可權,最後才能列印
		Field f = st1.getClass().getDeclaredField("x");
		f.setAccessible(true);
		System.out.println(f.get(st1));
		
		
		//通過修改位元組碼檔案來對String型別中的'a'改變成為'b'
		changeCharAtoB(st1);
		System.out.println(st1);
		
		
		//方法的反射
		String str="abc";
		Method methodCharAt = String.class.getMethod("charAt", int.class);
		//invoke作用於那個物件的身上(物件和方法沒有什麼關係)
		System.out.println(methodCharAt.invoke(str, 1));
		//如果invoke()的第一個引數為null,那麼意味是靜態的方法
		
		
		
		//正常的情況下我們呼叫main方法
		/*TestArguements.main(new String[]{"123","456"});*/
		//通過反射來呼叫,為什麼要通過反射去掉用呢?我們可能會遇到給main方法傳一些引數但是不知道去執行哪個類
		String starClassName = args[0];
		Method mainMethod = Class.forName(starClassName).getMethod("main", String[].class);
		//這裡使用一個object[]的原因是java傳進去陣列,會自動的拆開String相當於傳了兩個引數而實際上只需要一個
		mainMethod.invoke(null,new Object[]{ new String[]{"123","456"}});
		//或者使用下面的
		//mainMethod.invoke(null,( Object)new String[]{"123","456"});
		
		
		
		
		
		
		int [] a1 = {1,2,3};
		int[][] a2 = new int[2][3];
		String[] a3 = {"123","456"};
		//輸出的結果分別是[[
[email protected]
],[123, 456]後者屬於Object[](因為接收時分為Object[]和<T>型別),而String[]符合 //但是int[]不符合只能按照jdk1.4的以物件形式輸出 System.out.println(Arrays.asList(a1)); System.out.println(Arrays.asList(a3)); } public static void changeCharAtoB(Object obj) throws IllegalArgumentException, IllegalAccessException{ Field[] fields = obj.getClass().getFields(); for(Field f:fields){ //if(f.getType().equals(String.class){ //位元組碼的比較使用等號因為實用的位元組碼 if(f.getType()==String.class){ String oldVal = (String) f.get(obj); String newVal = oldVal.replace('a', 'b'); f.set(obj, newVal); //System.out.println(newVal); } } } } class TestArguements{ public static void main(String[] args){ for(String s:args){ System.out.println(s); } } }


stu:

package test;

public class stu {
	private int x;
	public int y;
	public String str1="ball";
	public String str2 = "basket";
	public stu(int x, int y) {
		this.x = x;
		this.y = y;
	}
	@Override
	public String toString() {
		return str1 +'\n'+" "+str2;
	}
}


相關推薦

Java學習日常(堆疊的理解成員變數方法構造器)

學習內容 使用Excel制定一個簡單的專案開發計劃表; 訪問控制修飾符在類設計中的意義及使用; 基本資料型別和引用資料型別在記憶體中的執行原理; 類的成員方法以及方法過載的意義; 構造器的使用以及構造器的過載; 封裝在類設計中的應用。 學習

java構造方法成員變數方法對應反射例項

最原始的class類中包含著一些構造器,包,方法,屬性等等內容,我們可以通過位元組碼檔案得到對應的一個構造器 ,並指明是那種構造器通過引數進行設定,然後通過Constructior類進行例項物件 package test; import java.lang.reflec

java第六天---面向物件成員變數成員方法封裝

1 面向物件的特徵 封裝、繼承、多型   2 類與物件         類:是一組相關的屬性和行為的集合      物件:是該類事物的具體體現        

java方法區/ 類變數成員變數區域性變數

方法區:類資訊、類變數(靜態變數和常量)、方法  堆:物件、成員變數  棧:區域性變數  (1)當程式執行時,首先通過類裝載器載入位元組碼檔案,經過解析後裝入方法區!在方法區中存了類的各種資訊,包括類變數、常量及方法。對於同一個方法的呼叫,同一個類的不同例項呼叫的都是存在方法

OC(一)類物件屬性成員變數方法(整理)

第一節   類、物件 >類(Class):具有相同屬性和行為等同一類元素等總稱,類是一個抽象的概念。 在Java中,類就是同一類事物的統稱,例如:鳥類、人類、魚類等等。 在OC中,類是表示物件型別的結構體,物件通過類來獲取自身的各種資訊,包括各種例項方法或類方法。

關於java中的區域性變數成員變數靜態變數

package com.imooc; /* * 成員變數:在類中定義,用來描述物件將要有什麼 * 區域性變數:在類的方法中定義,在方法中臨時儲存資料 * 靜態變數 :static 它屬於整個類所共有,靜態成員可以使用類名直接訪問,也可以使用物件進行訪問; * java中會給程式

Java基礎——靜態變數成員變數區域性變數

1. 變數的型別 在java語言中,變數的型別有3中:成員變數、靜態變數、區域性變數 (1)成員變數 當類被例項化時,成員變數就會在記憶體中分配空間被初始化,直到這個例項化物件的生命週期結束時,成員變數的生命週期才結束。所以,類的成員變數的作用範圍與類的例項化物件的作用範圍相同。 (

Java記憶體成員變數區域性變數

一 java記憶體分配  Java 中的資料型別分為  1. 基本型別(原始資料型別) byte short int long float double char boolean  基本型別的變數持有原始值。  2. 複合資料型別(引用型別),引用型別持有引用值(即對某

記憶體分配: 類變數例項變數成員變數區域性變數

成員變數有2種:類變數和例項變數 類變數(又叫靜態變數):前面加static關鍵字修飾; 1、 jvm把.class類載入到非堆裡,然後在堆中為.class的類變數開闢記憶體;堆中的地址存放於棧以便高速訪問; 2、類變數的生命週期一直持續到整個“系統”關閉; 3、一旦賦

Java成員變數構造方法程式碼塊執行順序剖析

今天,測試了一下java中成員變數、構造方法、程式碼塊等的執行順序,程式碼如下: package com.carol.entity; /** * @author Carol Tang * @version 1.0.0 * @date 2018-09-13 10:37

Java構造方法成員變數初始化以及靜態成員變數初始化三者的先後順序是什麼樣的?

【Java筆試真題】:構造方法、成員變數初始化以及靜態成員變數初始化三者的先後順序是什麼樣的? 【解答】: 當類第一次被載入的時候,靜態變數會首先初始化,接著編譯器會把例項變數初始化為預設值,然後執行構造方法。 Java程式的初始化一般遵循以下三個原則(以下三原則優先順序依次遞減): ①

Java成員變數普通成員變數初始化塊構造方法的初始化和執行順序

 序言   關於類的static成員變數初始化、static初始化塊、例項的普通成員變數初始化、例項的普通初始化塊以及建構函式的執行順序,我一直不是十分明確地知道,今天專門花了幾個小時的時間參考網上資料設計出了比較明瞭的測試程式碼,有程式碼有結果有真相。總體而言,sta

Java基礎篇——靜態程式碼塊靜態方法靜態變數構造方法構造程式碼段相關

基本定義 靜態程式碼段 在Java類的設計中,如果某段程式碼想讓其只執行一次,比如一個HashMap的生成,一個數據庫連線池的產生,就可以把相關程式碼寫入static{}包裹的程式碼段中。這個程式碼段就叫靜態程式碼段,在專案啟動時就主動執行,即由虛擬機器內部完成呼叫,且只執

Java-為什麼非靜態內部類裡面不能定義靜態方法靜態成員變數靜態初始化塊?

首先要明確一點: static修飾方法、成員變數是屬於類自己的。並不屬於特定的某個物件。所以我們可以像這樣使用static修飾的方法、變數:ClassName.methodName、ClassName

static程式碼塊成員變數初始化構造方法執行順序

下面程式碼: public class Son{ Father father = new Father(); static{ System.out.println("Son static"); } publi

java 構造方法static關鍵字靜態變數main方法

一、構造方法 構造方法是一個與類同名的方法,物件的成績就是通過構造方法完成的。每當類例項化一個物件時,類都會自動呼叫構造方法。 構造方法的特點如下: (1)構造方法沒有返回值,也不能定義為void。 (2)構造方法的名稱要與本類的名稱相同。 (3)構造

java中的static(包括類前面修飾的static方法前面修飾的static成員變數前面修飾的static)

原文 http://www.cnblogs.com/zhangshitong/p/4881362.html static是靜態修飾符: 什麼叫靜態修飾符呢?大家都知道,在程式中任何變數或者程式碼都是在編譯時由系統自動分配記憶體來儲存的,而所謂靜態就是指在編譯後所分配

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

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

JAVA父類子類靜態程式碼塊靜態變數構造方法的執行順序

1、第一個檔案Print.java public class Print {    public Print(String s){        System.out.print(s + " ");    }} 2、第二個檔案Test1.java public 

通過Java反射機制獲取物件方法成員變數

先定義一個JavaBean package com.jim.test.Test; public class User { private int id; private String name = "abc"; private Str