1. 程式人生 > >Java反射及使用例項

Java反射及使用例項

反射的概述

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;
    }