org.agiso.core.lang.util.ClassUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.agiso.core.lang.util.ClassUtils.java

Source

/* org.agiso.core.lang.util.ClassUtils (2013-05-17)
 * 
 * ClassUtils.java
 * 
 * Copyright 2013 agiso.org
 * 
 * Licensed 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.agiso.core.lang.util;

import java.lang.reflect.Method;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * 
 * @author Karol Kopacz
 * @since 1.0
 */
public abstract class ClassUtils {
    private static final Logger logger = Logger.getLogger(ClassUtils.class.getName());

    //   --------------------------------------------------------------------------
    //   Wyszukiwanie metod w klasach
    //   --------------------------------------------------------------------------
    /**
     * Sprawdza, czy wskazana klasa posiada publiczn metod o okrelonej sygnaturze.
     * 
     * <p>Based on:
     * org.springframework.util.ClassUtils.hasMethod(Class<?>, String, Class<?>...)
     * 
     * @param clazz Klasa do sprawdzenia
     * @param methodName Nazwa wyszukiwanej metody
     * @param paramTypes Tablica typw parametrw wywoania metody
     * @return <code>true</code> jeli klasa zawiera metod
     * @see Class#getMethod
     */
    public static boolean hasMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) {
        return (getMethodIfAvailable(clazz, methodName, paramTypes) != null);
    }

    /**
     * Wyszukuje dla wskazanej klasy publiczn metod o okrelonej sygnaturze. Jeli
     * metoda nie zostanie naleziona wyrzuca wyjtek {@code IllegalStateException}.
     * <p>W przypadku gdy nie jest okrelona tablica parametrw wywoania, zwraca metod
     * tylko gdy wynik wyszukiwania jest unikatowy, tj. istnieje tylko jedna publiczna
     * metoda o wskazanej nazwie.
     * 
     * <p>Based on:
     * org.springframework.util.ClassUtils.getMethod(Class<?>, String, Class<?>...)
     * 
     * @param clazz Klasa do sprawdzenia
     * @param methodName Nazwa wyszukiwanej metody
     * @param paramTypes Tablica typw parametrw wywoania metody
     *     (moe by {@code null} w celu wyszukania dowolnej metody o wskazanej nazwie)
     * @return Znaleziona metoda (niegdy {@code null})
     * @throws IllegalStateException jeli nie znaleziono metody lub nie jest unikatowa
     * @see Class#getMethod
     */
    public static Method getMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) {
        if (clazz == null) {
            throw new NullPointerException("Klasa musi by okrelona");
        }
        if (methodName == null) {
            throw new NullPointerException("Nazwa metody musi by okrelona");
        }

        if (paramTypes != null) {
            try {
                return clazz.getMethod(methodName, paramTypes);
            } catch (NoSuchMethodException ex) {
                throw new IllegalStateException("Expected method not found: " + ex);
            }
        } else {
            Set<Method> candidates = new HashSet<Method>(1);
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                if (methodName.equals(method.getName())) {
                    candidates.add(method);
                }
            }
            if (candidates.size() == 1) {
                return candidates.iterator().next();
            } else if (candidates.isEmpty()) {
                throw new IllegalStateException("Expected method not found: " + clazz + "." + methodName);
            } else {
                throw new IllegalStateException("No unique method found: " + clazz + "." + methodName);
            }
        }
    }

    /**
     * Wyszukuje dla wskazanej klasy publiczn metod o okrelonej sygnaturze. Jeli
     * metoda nie zostanie naleziona zwraca {@code null}.
     * <p>W przypadku gdy nie jest okrelona tablica parametrw wywoania, zwraca metod
     * tylko gdy wynik wyszukiwania jest unikatowy, tj. istnieje tylko jedna publiczna
     * metoda o wskazanej nazwie.
     * 
     * <p>Based on:
     * org.springframework.util.ClassUtils.getMethodIfAvailable(Class<?>, String, Class<?>...)
     * 
     * @param clazz Klasa do sprawdzenia
     * @param methodName Nazwa wyszukiwanej metody
     * @param paramTypes Tablica typw parametrw wywoania metody
     *     (moe by {@code null} w celu wyszukania dowolnej metody o wskazanej nazwie)
     * @return Znaleziona metoda lub @{code null} gdy nie istnieje lub nie jest unikatowa
     * @see Class#getMethod
     */
    public static Method getMethodIfAvailable(Class<?> clazz, String methodName, Class<?>... paramTypes) {
        if (clazz == null) {
            throw new NullPointerException("Klasa musi by okrelona");
        }
        if (methodName == null) {
            throw new NullPointerException("Nazwa metody musi by okrelona");
        }

        if (paramTypes != null) {
            try {
                return clazz.getMethod(methodName, paramTypes);
            } catch (NoSuchMethodException ex) {
                return null;
            }
        } else {
            Set<Method> candidates = new HashSet<Method>(1);
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                if (methodName.equals(method.getName())) {
                    candidates.add(method);
                }
            }
            if (candidates.size() == 1) {
                return candidates.iterator().next();
            }
            return null;
        }
    }

    //   --------------------------------------------------------------------------
    //   Wyszukiwanie lokalizacji biblioteki jar zawierajcej klas
    //   Na podstawie: https://dzone.com/articles/locate-jar-classpath-given
    //   --------------------------------------------------------------------------
    public static String locate(Class<?> c) /*throws ClassNotFoundException*/ {
        return locate(c, c.getClassLoader());
    }

    public static String locate(Class<?> c, ClassLoader cl) /*throws ClassNotFoundException*/ {
        return locate(c.getName(), cl);
    }

    public static String locate(String name, ClassLoader cl) /*throws ClassNotFoundException*/ {
        final URL location;
        final String classLocation = name.replace('.', '/') + ".class";

        if (cl == null) {
            location = ClassLoader.getSystemResource(classLocation);
        } else {
            location = cl.getResource(classLocation);
        }

        if (location != null) {
            Pattern p = Pattern.compile("^.*:(.*)!.*$");
            Matcher m = p.matcher(location.toString());
            if (m.find()) {
                return m.group(1);
            } else {
                if (logger.isLoggable(Level.WARNING)) {
                    logger.warning(
                            "Cannot parse location of '" + location + "'. " + "Probably not loaded from a Jar");
                }
                // throw new ClassNotFoundException("Cannot parse location of '"
                //       + location + "'.  Probably not loaded from a Jar");
                return null;
            }
        } else {
            if (logger.isLoggable(Level.WARNING)) {
                logger.warning("Cannot find class '" + name + " using the " + cl);
            }
            // throw new ClassNotFoundException("Cannot find class '"
            //       + name + " using the " + cl);
            return null;
        }
    }
}