-
之前學習Spring框架的時候感覺很喫力,主要原因是反射的知識沒有掌握好。今天把反射的知識認真地學了一下,對於框架的實現原理有了更深的認識。
-
框架簡單的來說就是一個半成品軟件。這裏要求在不更改框架源碼的情況下,讓框架幫我們自動創建對象、調用方法。簡單分析一下:
①首先,既然用戶不能更改框架的源碼,那麼框架想要幫用戶創建用戶所自定義的類的對象,就不能直接“new 用戶自定義的類”,框架是事先寫好的,怎麼會知道用戶到底自己寫了哪些類?總之,就是不能用“new”。
②既然不能用new,那隻能用反射了。我們知道,獲取Class對象有3種方式,其中一種方式是Class.forName(“全限定類名”)。注意這裏的全限定類名是字符串,在編譯的時候不會報錯。
③於是,可以通過配置文件的方式,把配置文件中全限定類名讀取出來,作爲forName()方法的參數。那麼,就可以獲取一個Class對象了
④獲取Class對象之後,就可以調用其中的方法了。當然,方法的名稱也要在配置文件中寫上纔行。 -
下面是代碼
①用戶自定義的類:
package domain;
public class Student
{
public void sleep()
{
System.out.println("我正在睡覺。。。");
}
}
②框架類:
package reflect;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectTest
{
public static void main(String[] args) throws Exception
{
Properties properties=new Properties();
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("pro.properties");
properties.load(inputStream);
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
Class aClass = Class.forName(className);
Object o = aClass.newInstance();
Method method = aClass.getMethod(methodName);
method.invoke(o);
}
}
- 配置文件pro.properties的內容如下:
className=domain.Student
methodName=sleep
- 運行結果