org.openflamingo.util.ReflectionUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.openflamingo.util.ReflectionUtils.java

Source

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.openflamingo.util;

import org.apache.commons.beanutils.PropertyUtils;
import org.openflamingo.core.exception.WorkflowException;
import org.slf4j.helpers.MessageFormatter;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Set;

/**
 * Java Reflection Utilty. ?  ?  Java Reflection ?  API ?   .
 *
 * @author Byoung Gon, Kim
 * @version 0.1
 */
public class ReflectionUtils {

    /**
     *  ? ? {@link Class}  ?   . ?     <tt>false</tt> .
     *
     * @param className    ?
     * @param classLoader  ? ?(<tt>null</tt>? ?  ?)
     * @return  ?  
     */
    public static boolean isPresent(String className, ClassLoader classLoader) {
        return org.springframework.util.ClassUtils.isPresent(className, classLoader);
    }

    /**
     * ? ?("int" ?) ?  ?("String[]" ?)? Class ??    <tt>Class.forName()</tt>?  . ?   
     * ? ? .   Thread Context Class Loader ? ClassUtils  Class Loader?.
     *
     * @param className ?
     * @return  ?? Class ?
     * @throws org.openflamingo.core.exception.WorkflowException ? ?   
     * @see Class#forName(String, boolean, ClassLoader)
     * @see #getDefaultClassLoader()
     */
    public static Class forName(String className) throws WorkflowException {
        try {
            return org.springframework.util.ClassUtils.forName(className,
                    Thread.currentThread().getContextClassLoader());
        } catch (ClassNotFoundException e) {
            String message = MessageFormatter.format("Cannot find '{}' in CLASSPATH", className).getMessage();
            throw new WorkflowException(message, e);
        }
    }

    /**
     * ? ?("int" ?) ?  ?("String[]" ?)? Class ??    <tt>Class.forName()</tt>?  .
     *
     * @param className   ?
     * @param classLoader  ? ?(<tt>null</tt>? ?  ?)
     * @return  ?? Class ?
     * @throws ClassNotFoundException ? ?   
     * @throws LinkageError           ? ??    
     * @see Class#forName(String, boolean, ClassLoader)
     */
    public static Class forName(String className, ClassLoader classLoader)
            throws ClassNotFoundException, LinkageError {
        return org.springframework.util.ClassUtils.forName(className, classLoader);
    }

    /**
     *  ?? Class ? . ?  "int" ? ? ? ? "String[]" ?  ?? ?.
     * <p/><pre>
     * Class clazz = ReflectionUtils.resolveClassName("org.openflamingo.util.ReflectionUtils",
     * Thread.currentThread().getContextClassLoader());
     * String className = clazz.getName(); // Name is "org.openflamingo.util.ReflectionUtils"
     * </pre>
     *
     * @param className   ?
     * @param classLoader  ? ?(<tt>null</tt>? ?  ?)
     * @return  ?? Class ?
     * @throws IllegalArgumentException ??    (, ? ??    )
     * @see #forName(String, ClassLoader)
     */
    public static Class resolveClassName(String className, ClassLoader classLoader)
            throws IllegalArgumentException {
        return org.springframework.util.ClassUtils.resolveClassName(className, classLoader);
    }

    /**
     * ? ? ?  ? .
     * <p/><pre>
     * Class clazz = ReflectionUtils.resolvePrimitiveClassName("int");
     * String className = clazz.getName(); // Name is "int"
     * </pre>
     *
     * @param name ? ? ?
     * @return ? ? ? ? ? ? ?   <tt>null</tt>
     */
    public static Class resolvePrimitiveClassName(String name) {
        return org.springframework.util.ClassUtils.resolvePrimitiveClassName(name);
    }

    /**
     * ? ? ? ?? .
     *
     * @param className ?
     * @return ? ?
     */
    public static String getShortName(String className) {
        return org.springframework.util.ClassUtils.getShortName(className);
    }

    /**
     * ? ? ? ?? .
     *
     * @param clazz ? ??  ?
     * @return ? ?? ? ?
     */
    public static String getShortName(Class clazz) {
        return org.springframework.util.ClassUtils.getShortName(clazz);
    }

    /**
     * ?  ?  Property ? ? ?? ? ? ?? .   "FooBah" "fooBah", "X" "x" ?.  "URL"?  "URL"?
     * .
     *
     * @param clazz ?
     * @return ?  ?  Property ? ??? ? ?
     * @see java.beans.Introspector#decapitalize(String)
     */
    public static String getShortNameAsProperty(Class clazz) {
        return org.springframework.util.ClassUtils.getShortNameAsProperty(clazz);
    }

    /**
     *  ?? ? ?? .   "Foo"?  "Foo.class" ?.
     *
     * @param clazz ?
     * @return ".class" ?? ?
     */
    public static String getClassFileName(Class clazz) {
        return org.springframework.util.ClassUtils.getClassFileName(clazz);
    }

    /**
     *  ?? qualified name? . "<tt>ClassUtils</tt>"?  "org.openflamingo.manager.util.ClassUtils" .
     *
     * @param clazz ?
     * @return ?? qualified name
     */
    public static String getQualifiedName(Class clazz) {
        return org.springframework.util.ClassUtils.getQualifiedName(clazz);
    }

    /**
     *  ? qualified ? .  ?? qualified ??/? + "." +  ?.
     *
     * @param method 
     * @return qualified 
     */
    public static String getQualifiedMethodName(Method method) {
        return org.springframework.util.ClassUtils.getQualifiedMethodName(method);
    }

    /**
     *  ??  signature  ??   . ?   <tt>NoSuchMethodException</tt>? 
     * "<tt>false</tt>" .
     *
     * @param clazz       ?
     * @param paramTypes ? ? 
     * @return ??  ??  
     */
    public static boolean hasConstructor(Class clazz, Class[] paramTypes) {
        return org.springframework.util.ClassUtils.hasConstructor(clazz, paramTypes);
    }

    /**
     *  ??  signature  ??   .  ??    <tt>null</tt>? . ?  
     * <tt>NoSuchMethodException</tt>?  "<tt>null</tt>" .
     *
     * @param clazz       ?
     * @param paramTypes ? ? 
     * @return ??   ??,    <tt>null</tt>
     */
    public static Constructor getConstructorIfAvailable(Class clazz, Class[] paramTypes) {
        return org.springframework.util.ClassUtils.getConstructorIfAvailable(clazz, paramTypes);
    }

    /**
     *  ??  signature    . ?   <tt>NoSuchMethodException</tt>?  "<tt>false</tt>"
     * .
     *
     * @param clazz       ?
     * @param methodName 
     * @param paramTypes ? ? 
     * @return ??    
     */
    public static boolean hasMethod(Class clazz, String methodName, Class[] paramTypes) {
        return org.springframework.util.ClassUtils.hasMethod(clazz, methodName, paramTypes);
    }

    /**
     *  ??  signature    .      <tt>null</tt>? . ?  
     * <tt>NoSuchMethodException</tt>?  "<tt>null</tt>" .
     *
     * @param clazz       ?
     * @param methodName 
     * @param paramTypes ? ? 
     * @return    ,    <tt>null</tt>
     */
    public static Method getMethodIfAvailable(Class clazz, String methodName, Class[] paramTypes) {
        return org.springframework.util.ClassUtils.getMethodIfAvailable(clazz, methodName, paramTypes);
    }

    /**
     *  ? ?  ??     1 ??  ?. ?  non-public  ?.
     *
     * @param clazz       ?
     * @param methodName 
     * @return   ?? ? <tt>true</tt>
     */
    public static boolean hasAtLeastOneMethodWithName(Class clazz, String methodName) {
        return org.springframework.util.ClassUtils.hasAtLeastOneMethodWithName(clazz, methodName);
    }

    /**
     * ?? static  .
     *
     * @param methodName static 
     * @param clazz       ??  ?
     * @param args       ? 
     * @return static    static ,    <tt>null</tt>
     * @throws IllegalArgumentException ?  ? <tt>null</tt>? 
     */
    public static Method getStaticMethod(Class clazz, String methodName, Class[] args) {
        return org.springframework.util.ClassUtils.getStaticMethod(clazz, methodName, args);
    }

    /**
     *  ?/?? ? ?? ? .
     *
     * @param classes ? 
     * @return "[com.foo.Bar, com.foo.Baz]" ?? ?
     */
    public static String classNamesToString(Class[] classes) {
        return org.springframework.util.ClassUtils.classNamesToString(classes);
    }

    /**
     * Collection ?  ?/???  ?? ? .
     *
     * @param collection ? ?? Collection
     * @return "[com.foo.Bar, com.foo.Baz]" ?? ?
     */
    public static String classNamesToString(Collection collection) {
        return org.springframework.util.ClassUtils.classNamesToString(collection);
    }

    /**
     *  ?    ?? .
     *
     * @param instance ?
     * @return    ??
     */
    public static Class[] getAllInterfaces(Object instance) {
        return org.springframework.util.ClassUtils.getAllInterfaces(instance);
    }

    /**
     *  ??  ?? .
     *
     * @param clazz ?
     * @return ?    ??
     */
    public static Class[] getAllInterfacesForClass(Class clazz) {
        return org.springframework.util.ClassUtils.getAllInterfacesForClass(clazz);
    }

    /**
     *  ?    ?? .
     *
     * @param instance ?
     * @return ?    ??? {@link java.util.Set}
     */
    public static Set getAllInterfacesAsSet(Object instance) {
        return org.springframework.util.ClassUtils.getAllInterfacesAsSet(instance);
    }

    /**
     *  ?    ?? .
     *
     * @param clazz ?
     * @return ?    ??? {@link java.util.Set}
     */
    public static Set getAllInterfacesForClassAsSet(Class clazz) {
        return org.springframework.util.ClassUtils.getAllInterfacesForClassAsSet(clazz);
    }

    /**
     *  ? ? .
     *
     * @return  ? ?( <tt>null</tt>? ?  ?)
     */
    public static ClassLoader getDefaultClassLoader() {
        return org.springframework.util.ClassUtils.getDefaultClassLoader();
    }

    /**
     *  ??  ??   .      <tt>null</tt>? .
     *
     * @param type       ? 
     * @param name       
     * @param paramTypes  ? 
     * @return 
     */
    public static Method findMethod(Class type, String name, Class[] paramTypes) {
        return org.springframework.util.ReflectionUtils.findMethod(type, name, paramTypes);
    }

    /**
     *  ??    .      <tt>null</tt>? .
     *
     * @param type ? 
     * @param name 
     * @return 
     */
    public static Method findMethod(Class type, String name) {
        return org.springframework.util.ReflectionUtils.findMethod(type, name);
    }

    /**
     *  ??  ??   .   static ?  null? .
     *
     * @param method   
     * @param instance ?
     * @return  
     */
    public static Object invokeMethod(Method method, Object instance) {
        return org.springframework.util.ReflectionUtils.invokeMethod(method, instance);
    }

    /**
     * ? Signature .
     *
     * @param method 
     * @return ? Signature
     */
    private static String getMethodSignature(Method method) {
        String methodName = method.getName();
        Class<?>[] classes = method.getParameterTypes();

        StringBuilder builder = new StringBuilder();
        builder.append("[ ");
        builder.append(methodName);
        builder.append("(");
        for (int i = 0; i < classes.length; i++) {
            Class<?> aClass = classes[i];
            builder.append(aClass.getName());
            if (i != (classes.length - 1)) {
                builder.append(", ");
            }
        }
        builder.append(")");
        builder.append(" ]");
        return builder.toString();
    }

    /**
     * ? Signature .
     *
     * @param method 
     * @return ? Signature
     */
    private static String getMethodSignature(Method method, Object[] args) {
        String methodName = method.getName();
        Class<?>[] classes = method.getParameterTypes();

        StringBuilder builder = new StringBuilder();
        builder.append("[ ");
        builder.append(methodName);
        builder.append("(");
        builder.append(getMethodParameter(classes, args));
        builder.append(")");
        builder.append(" ]");
        return builder.toString();
    }

    /**
     * ? ? .
     *
     * @param classes ?
     * @param args    ??
     * @return ? ?
     */
    private static String getMethodParameter(Class<?>[] classes, Object[] args) {
        if (args == null) {
            return "";
        }
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < classes.length; i++) {
            Class<?> aClass = classes[i];
            builder.append(aClass.getName());
            builder.append("(");
            builder.append(args[i]);
            builder.append(")");
            if (i != (classes.length - 1)) {
                builder.append(", ");
            }
        }
        return builder.toString();
    }

    /**
     *  ?   ? ? .
     *
     * @param args ? 
     * @return ? ?
     */
    private static String getMethodParameter(Object[] args) {
        if (args == null) {
            return "";
        }
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < args.length; i++) {
            Class<?> aClass = args[i].getClass();
            builder.append(aClass.getName());
            builder.append("(");
            builder.append(args[i]);
            builder.append(")");
            if (i != (args.length - 1)) {
                builder.append(", ");
            }
        }
        return builder.toString();
    }

    /**
     *  ??  ??   .   <tt>static</tt> ?  <tt>null</tt>? .
     *
     * @param method   
     * @param instance ?
     * @param args     ? ??
     * @return  
     */
    public static Object invokeMethod(Method method, Object instance, Object[] args) {
        return org.springframework.util.ReflectionUtils.invokeMethod(method, instance, args);
    }

    /**
     *  .
     *
     * @param className      ?
     * @param methodName     
     * @param parameterType  ? 
     * @param parameterValue ?
     * @return  
     * @throws org.openflamingo.core.exception.WorkflowException     
     */
    public static Object invokeMethod(String className, String methodName, String parameterType,
            Object parameterValue) throws WorkflowException {
        Class clazz = null;
        try {
            clazz = ReflectionUtils.forName(className);
            Class paramType = ReflectionUtils.forName(parameterType);
            Method invokableMethod = ReflectionUtils.findMethod(clazz, methodName, new Class[] { paramType });
            return ReflectionUtils.invokeMethod(invokableMethod, clazz.newInstance(),
                    new Object[] { parameterValue });
        } catch (IllegalAccessException e) {
            String message = MessageFormatter.format("Cannot access '{}'", className).getMessage();
            throw new WorkflowException(message, e);
        } catch (InstantiationException e) {
            String message = MessageFormatter.format("Cannot create a instance of '{}'", className).getMessage();
            throw new WorkflowException(message, e);
        }
    }

    /**
     * ??  .
     *
     * @param instance   ?
     * @param name     
     * @param arg      ??
     * @return   
     * @throws NoSuchMethodException                          
     * @throws IllegalAccessException                       ?    
     * @throws java.lang.reflect.InvocationTargetException  ?  ? 
     */
    public static Object invokeMethod(Object instance, String name, Object arg)
            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        return org.apache.commons.beanutils.MethodUtils.invokeMethod(instance, name, arg);
    }

    /**
     * ??  .
     *
     * @param instance   ?
     * @param name     
     * @param args     ??
     * @return   
     * @throws NoSuchMethodException                          
     * @throws IllegalAccessException                       ?    
     * @throws java.lang.reflect.InvocationTargetException  ?  ? 
     */
    public static Object invokeMethod(Object instance, String name, Object[] args)
            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        return org.apache.commons.beanutils.MethodUtils.invokeMethod(instance, name, args);
    }

    /**
     * ??  .
     *
     * @param instance     ?
     * @param name       
     * @param args       ??
     * @param paramTypes ? 
     * @return   
     * @throws NoSuchMethodException                          
     * @throws IllegalAccessException                       ?    
     * @throws java.lang.reflect.InvocationTargetException  ?  ? 
     */
    public static Object invokeMethod(Object instance, String name, Object[] args, Class[] paramTypes)
            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        return org.apache.commons.beanutils.MethodUtils.invokeMethod(instance, name, args, paramTypes);
    }

    /**
     * ??  .
     *
     * @param instance   ?
     * @param name     
     * @param arg      ??
     * @return   
     * @throws NoSuchMethodException                          
     * @throws IllegalAccessException                       ?    
     * @throws java.lang.reflect.InvocationTargetException  ?  ? 
     */
    public static Object invokeExactMethod(Object instance, String name, Object arg)
            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        return org.apache.commons.beanutils.MethodUtils.invokeExactMethod(instance, name, arg);
    }

    /**
     * ??  .
     *
     * @param instance   ?
     * @param name     
     * @param args     ??
     * @return   
     * @throws NoSuchMethodException                          
     * @throws IllegalAccessException                       ?    
     * @throws java.lang.reflect.InvocationTargetException  ?  ? 
     */
    public static Object invokeExactMethod(Object instance, String name, Object[] args)
            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        return org.apache.commons.beanutils.MethodUtils.invokeExactMethod(instance, name, args);
    }

    /**
     * ??  .
     *
     * @param instance     ?
     * @param name       
     * @param args       ??
     * @param paramTypes ? 
     * @return   
     * @throws NoSuchMethodException                          
     * @throws IllegalAccessException                       ?    
     * @throws java.lang.reflect.InvocationTargetException  ?  ? 
     */
    public static Object invokeExactMethod(Object instance, String name, Object[] args, Class[] paramTypes)
            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        return org.apache.commons.beanutils.MethodUtils.invokeExactMethod(instance, name, args, paramTypes);
    }

    /**
     * ?    .
     *
     * @param clazz ?
     * @return  
     * @throws IllegalArgumentException ?     
     */
    public static Method[] getAllDeclaredMethods(Class clazz) throws IllegalArgumentException {
        return org.springframework.util.ReflectionUtils.getAllDeclaredMethods(clazz);
    }

    /**
     *  ?? ? ?.
     *
     * @param className Qualified Full Class Name
     * @return ?
     * @throws org.openflamingo.core.exception.WorkflowException ? ?   
     */
    public static Object newInstance(String className) throws WorkflowException {
        Class clazz = null;
        try {
            clazz = ReflectionUtils.forName(className);
            return clazz.newInstance();
        } catch (Exception e) {
            String message = MessageFormatter.format("Cannot create a instance of '{}'", className).getMessage();
            throw new WorkflowException(message, e);
        }
    }

    /**
     *  ?? ?  Setter .
     *
     * @param instance  ?
     * @param fieldName ? 
     * @return Setter
     * @throws org.openflamingo.core.exception.WorkflowException Setter    
     */
    public static Method getSetterMethod(Object instance, String fieldName) throws WorkflowException {
        try {
            PropertyDescriptor propertyDescriptor = PropertyUtils.getPropertyDescriptor(instance, fieldName);
            return propertyDescriptor.getWriteMethod();
        } catch (Exception e) {
            String message = MessageFormatter
                    .format("Cannot find setter method of '{}' in '{}'.", fieldName, instance.getClass().getName())
                    .getMessage();
            throw new WorkflowException(message, e);
        }
    }

    /**
     *  ?? ?  Getter .
     *
     * @param instance  ?
     * @param fieldName ? 
     * @return Getter
     * @throws org.openflamingo.core.exception.WorkflowException Getter    
     */
    public static Method getGetterMethod(Object instance, String fieldName) throws WorkflowException {
        try {
            PropertyDescriptor propertyDescriptor = PropertyUtils.getPropertyDescriptor(instance, fieldName);
            return propertyDescriptor.getReadMethod();
        } catch (Exception e) {
            String message = MessageFormatter
                    .format("Cannot find getter method of '{}' in '{}'.", fieldName, instance.getClass().getName())
                    .getMessage();
            throw new WorkflowException(message, e);
        }
    }
}