Java反射及使用例項
阿新 • • 發佈:2018-12-23
反射的概述
JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的位元組碼檔案物件。而解剖使用的就是Class類中的方法.所以先要獲取到每一個位元組碼檔案對應的Class型別的物件.
ioc,aop都是基於Java的反射機制來是實現的。
如下具體實現一個例項:
/**
* 通過物件,方法名稱以及引數 來 呼叫方法
*/
public static Object invokeMethod (Object owner, String methodName, Object... args) throws Exception {
Class<?> clazz = owner.getClass();
Method method = findMethod(clazz, methodName);
method.setAccessible(true);
return method.invoke(owner, args);
}
/**
* 通過物件,方法名稱以及引數 來 呼叫方法
*/
public static Object invokeMethod(Object owner, String methodName, Class<?>[] parameterTypes, Object... args)
throws Exception {
Class<?> clazz = owner.getClass();
Method method = findMethod(clazz, methodName, parameterTypes);
method.setAccessible(true );
return method.invoke(owner, args);
}
其中的具體獲取方法是:
/**
* Attempt to find a {@link Method} on the supplied class with the supplied name
* and parameter types. Searches all superclasses up to {@code Object}.
* <p>Returns {@code null} if no {@link Method} can be found.
* @param clazz the class to introspect
* @param name the name of the method
* @param paramTypes the parameter types of the method
* (may be {@code null} to indicate any signature)
* @return the Method object, or {@code null} if none found
*/
public static Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes) {
Assert.notNull(clazz, "Class must not be null");
Assert.notNull(name, "Method name must not be null");
Class<?> searchType = clazz;
while (searchType != null) {
Method[] methods = (searchType.isInterface() ? searchType.getMethods() : getDeclaredMethods(searchType));
for (Method method : methods) {
if (name.equals(method.getName()) &&
(paramTypes == null || Arrays.equals(paramTypes, method.getParameterTypes()))) {
return method;
}
}
searchType = searchType.getSuperclass();
}
return null;
}