欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java反射機制的簡單講解

 更新時間:2021年07月01日 09:24:19   作者:_Yoke  
這篇文章主要介紹了Java反射機制的簡單講解,本文講解了Java的高級概念反射機制,通過文字介紹案例該項概念和代碼的詳細展示,需要的朋友可以參考下

🌱1. 什么是反射機制?

首先大家應該先了解兩個概念,編譯期和運行期,編譯期就是編譯器幫你把源代碼翻譯成機器能識別的代碼,比如編譯器把java代碼編譯成jvm識別的字節(jié)碼文件,而運行期指的是將可執(zhí)行文件交給操作系統(tǒng)去執(zhí)行,JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動態(tài)獲取信息以及動態(tài)調用對象方法的功能稱為java語言的反射機制
簡單說,反射機制值得是程序在運行時能夠獲取自身的信息。在java中,只要給定類的名字,那么就可以通過反射機制來獲得類的所有信息。

🌱2. java反射機制提供了什么功能?

  • 在運行時能夠判斷任意一個對象所屬的類
  • 在運行時構造任意一個類的對象
  • 在運行時判斷任意一個類所具有的成員變量和方法
  • 在運行時調用任一對象的方法
  • 在運行時創(chuàng)建新類對象

🌱3.new和反射創(chuàng)建有什么區(qū)別呢?

new: 靜態(tài)編譯,在編譯期就將模塊編譯進來,執(zhí)行該字節(jié)碼文件,所有的模塊都被加載;

反射:動態(tài)編譯,編譯期沒有加載,等到模塊被調用時才加載;

注:spring的ioc就用到反射機制,newInstance創(chuàng)建。更加的通用,并且降低耦合,避免了硬編碼,只需提供一個字符串就可以動態(tài)的創(chuàng)建。

String className = readfromXMlConfig;//從xml 配置文件中獲得字符串

Class c = Class.forName(className);

factory = (AInterface)c.newInstance();

舉例:

有自行車🚲,小轎車🚗,

靜態(tài):上班將自行車放車里去上班,一定得帶著,一個不能落下,

動態(tài):將自行車放家里,交通堵塞騎自行車去,車放家里。

🌱4. 如何通過反射調用私有對象?

Field[] declaredFields = clazz.getDeclaredFields();

for (Field f : declaredFields) {
			System.out.println("屬性的名稱:" + f.getName());
			System.out.println("屬性的類型:" + f.getType().getName());
			// 給屬性賦值
			f.setAccessible(true);// 設置為私有屬性可以訪問

🌱5.如何通過反射調用方法?

		Method m = stuClass.getMethod("show1", String.class);
		System.out.println(m);
		//實例化一個Student對象
		Object obj = stuClass.getConstructor().newInstance();
		m.invoke(obj, "劉德華");

🌱6. class類一部分常用方法總結

  • 獲取公共構造器 getConstructors()
  • 獲取所有構造器getDeclaredConstructors
  • 獲取包含的方法 getMethod()
  • 獲取包含的屬性 getField(String name)
  • 獲取內部類 getDeclaredClasses()
  • 獲取外部類getDeclaringClass()
  • 獲取所實現(xiàn)的接口 getInterfaces()
  • 獲取修飾符 getModifiers()
  • 獲取所在包 getPackage()
  • 獲取類名包含包路徑 getName()

java反射的簡單演示

package com.fjh;

public class Student {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Student(String name, int age) {
		
		this.name = name;
		this.age = age;
	}
	public Student() {
		System.out.println("實例化一個對象!");
	
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
	
}


package com.fjh;

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

public class ReflectTest {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException,
			SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
		// 普通方法創(chuàng)建一個對象
		Student stu = new Student();
		// 利用反射機制創(chuàng)建一個對象
		Student newInstance = Student.class.newInstance();
		// 通過字節(jié)碼獲取屬性
		Class clazz = Student.class;
		// Field field = clazz.getField("name");//指定返回一個公有的屬性
		Field field = clazz.getDeclaredField("name");
		System.out.println("屬性的名稱:" + field.getName());
		System.out.println("屬性的類型:" + field.getType().getName());

		System.out.println("---------------------");
		// 獲取一個類中的所有屬性
		Field[] declaredFields = clazz.getDeclaredFields();
		for (Field f : declaredFields) {
			System.out.println("屬性的名稱:" + f.getName());
			System.out.println("屬性的類型:" + f.getType().getName());
			// 給屬性賦值
			f.setAccessible(true);// 設置為私有屬性可以訪問

			if (int.class == f.getType()) {
				f.set(newInstance, 50);
			} else if (String.class == f.getType()) {
				f.set(newInstance, "蔡徐坤");
			}
		}
		System.out.println("========通過直接賦值后的結果==========");
		System.out.println(newInstance);
		
		System.out.println("========獲取所有方法==========");

		// 獲取所有方法 不包括構造方法
		Method[] methods = clazz.getDeclaredMethods();
		for (Method method : methods) {
			String methodName = method.getName();// 參數(shù)名稱
			int parameterCount = method.getParameterCount();// 參數(shù)個數(shù)
			System.out.println("方法名字:" + methodName);
			System.out.println("方法參數(shù)個數(shù):" + parameterCount);
			Class<?>[] parameterTypes = method.getParameterTypes();
			// 獲取每個方法的參數(shù)類型
			for (Class<?> class1 : parameterTypes) {
				System.out.println("參數(shù)類型:" + class1.getName());
			}

			// 獲取方法的返回值
			Class<?> returnType = method.getReturnType();
			System.out.println("方法的返回值為:" + returnType.getName());
			System.out.println("-------------------");
		}

		// 執(zhí)行獲取到的 方法
		// 如果方法參數(shù)有多個,則需要用字節(jié)碼數(shù)組來代替
		// Method declaredMethod = clazz.getDeclaredMethod("setName", new
		// Class[]{String.class,int.class});
		// 執(zhí)行方法同樣使用數(shù)組
		// declaredMethod.invoke(newInstance,Object[]{"mayun",20} );
		Method declaredMethod = clazz.getDeclaredMethod("setName", String.class);// 返回當前Class對象表示的類或接口的指定已說明的一個方法對象。
		declaredMethod.invoke(newInstance, "馬云");
		System.out.println("==========設值注入=========");
		System.out.println(newInstance);

		// 構造函數(shù)
		Constructor constructor = clazz.getConstructor(new Class[] { String.class, int.class });
		// 如何執(zhí)行構造函數(shù)
		Object obj = constructor.newInstance(new Object[] { "周杰倫", 46 });
		System.out.println("==========構造注入=========");
		System.out.println(obj);
		
		System.out.println("==========構造方法=========");
		//獲取所有的構造函數(shù)
		Constructor[] constructors = clazz.getConstructors();
		for (Constructor c : constructors) {
			if(c.getParameterCount() != 0){
				Class[] parameterTypes = c.getParameterTypes();
				for (Class class1 : parameterTypes) {
					System.out.println("參數(shù)類型:"+class1.getTypeName());
				}
				System.out.println("-------------------");
			}else{
				System.out.println("無參構造");
				System.out.println("-------------------");
			}
		}
	}

}

🌱7. 結果

在這里插入圖片描述

在這里插入圖片描述

到此這篇關于Java反射機制的簡單講解的文章就介紹到這了,更多相關Java反射機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于java流實現(xiàn)壓縮圖片過程解析

    基于java流實現(xiàn)壓縮圖片過程解析

    這篇文章主要介紹了基于java流實現(xiàn)壓縮圖片過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • java構造方法的作用總結

    java構造方法的作用總結

    在本篇文章里小編給大家整理了關于java構造方法的相關知識點以及實例代碼,有需要的朋友們可以學習下。
    2019-07-07
  • Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable)

    Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable)

    本文主要介紹了Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • java實現(xiàn)簡單的小超市程序

    java實現(xiàn)簡單的小超市程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單的小超市程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • hibernate一對多關聯(lián)映射學習小結

    hibernate一對多關聯(lián)映射學習小結

    這篇文章主要介紹了hibernate一對多關聯(lián)映射學習小結,需要的朋友可以參考下
    2017-09-09
  • 深入理解Java抽象類

    深入理解Java抽象類

    這篇文章主要介紹了Java抽象類的相關資料,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-08-08
  • JustAuth整合第三方登錄組件樣例

    JustAuth整合第三方登錄組件樣例

    這篇文章主要為大家介紹了JustAuth整合第三方登錄組件樣例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Spring Boot使用RestTemplate消費REST服務的幾個問題記錄

    Spring Boot使用RestTemplate消費REST服務的幾個問題記錄

    這篇文章主要介紹了Spring Boot使用RestTemplate消費REST服務的幾個問題記錄,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • idea 列編輯模式取消的操作

    idea 列編輯模式取消的操作

    這篇文章主要介紹了idea 列編輯模式取消的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java中l(wèi)ist集合為空或為null的區(qū)別說明

    Java中l(wèi)ist集合為空或為null的區(qū)別說明

    這篇文章主要介紹了Java中l(wèi)ist集合為空或為null的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論