前言:
IoC 是Spring 容器的內核,AOP,事物式聲明等功能都是建立在此基礎上開花結果。那麼建立IoC的基礎就是基於JAVA的反射機制。
(一)JAVA的另一種引用對象的方法。
大家知道,當我要引用一個類時候,通常通過Class構造函數進行實例化。例如:Car car=new Car(); 的方式。其實在JAVA語言中,JAVA 語言允許通過程序化的方式間接對Class進行操作,Class文件由類的裝載器裝載後,在JVM中形成一份描述Class結構的元信息對象,通過元信息對對象可以獲知Class的結構信息,例如:構造函數,屬性,方法。
(二)JAVA 反射機制示例
實體: Car
- package com.reflect;
- public class Car {
- private String brand;
- private String color;
- private int maxSpeed;
- public String getBrand() {
- return brand;
- }
- public void setBrand(String brand) {
- this.brand = brand;
- }
- public String getColor() {
- return color;
- }
- public void setColor(String color) {
- this.color = color;
- }
- public int getMaxSpeed() {
- return maxSpeed;
- }
- public void setMaxSpeed(int maxSpeed) {
- this.maxSpeed = maxSpeed;
- }
- public Car() {
- }
- public void introduce() {
- System.out.println(brand+color+maxSpeed);
- }
- }
Car反射機制代碼:
- package com.reflect;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Method;
- public class TestReflect {
- public static void main(String[] args) throws Throwable {
- Car car= initByDefaultConst();
- car.introduce();
- }
- public static Car initByDefaultConst()throws Throwable {
- //獲取當前線程的上下文 Classloader
- ClassLoader loader=Thread.currentThread().getContextClassLoader();
- //通過類的裝載器獲取Car類的對象
- @SuppressWarnings("rawtypes")
- Class clazz=loader.loadClass("com.reflect.Car");
- //獲取構造方法
- @SuppressWarnings({ "rawtypes", "unchecked" })
- Constructor cons=clazz.getDeclaredConstructor((Class[])null);
- Car car=(Car)cons.newInstance();
- @SuppressWarnings("unchecked")
- Method setBrand=clazz.getMethod("setBrand", String.class);
- setBrand.invoke(car, "紅旗CA72");
- @SuppressWarnings("unchecked")
- Method setColor=clazz.getMethod("setColor", String.class);
- setColor.invoke(car, "黑色");
- @SuppressWarnings("unchecked")
- Method setMaxSpeed=clazz.getMethod("setMaxSpeed", int.class);
- setMaxSpeed.invoke(car, 200);
- return car;
- }
- }
輸出結果:
Java 類裝載器工作機制:
類裝載器:就是尋找字節碼文件並構建在JVM內部表示對象的組件。
類裝載步驟:
1 裝載:查找和導入Class文件。
2.連接:a 校驗 b準備 c解析
3 初始化: 對靜態變量 ,靜態代碼進行初始化。