org.tensorics.core.util.Classes.java Source code

Java tutorial

Introduction

Here is the source code for org.tensorics.core.util.Classes.java

Source

// @formatter:off
/*******************************************************************************
*
* This file is part of tensorics.
* 
* Copyright (c) 2008-2011, CERN. All rights reserved.
*
* 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.
* 
******************************************************************************/
// @formatter:on

package org.tensorics.core.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import com.google.common.collect.ImmutableMultiset;
import com.google.common.collect.ImmutableMultiset.Builder;
import com.google.common.collect.Multiset;

/**
 * Provides utility methods for reflection based tasks, for example to detect types of generic parameters.
 * 
 * @author kfuchsbe
 */
public final class Classes {

    /**
     * Private constructor to avoid instantiation
     */
    private Classes() {
        /* only static methods */
    }

    public static ParameterizedType findGenericSuperclassOfType(Class<?> clazz, Class<?> classToSearch) {
        Class<?> superClass = clazz.getSuperclass();
        if (superClass == null) {
            throw new IllegalArgumentException(
                    "The class '" + classToSearch + "' is not a super class of the given class.");
        }

        Type type = clazz.getGenericSuperclass();
        if ((type instanceof ParameterizedType)) {
            if (!superClass.equals(classToSearch)) {
                throw new IllegalArgumentException("The covariant coordinate class does not specify directly the "
                        + "type of coordinate, but seems to use another generic class in the inheritance hierarchy. "
                        + "This is currently not supported.");
            }
            return (ParameterizedType) type;
        }
        return findGenericSuperclassOfType(superClass, classToSearch);
    }

    public static Multiset<Class<?>> classesOf(Iterable<?> coordinates) {
        Builder<Class<?>> builder = ImmutableMultiset.builder();
        for (Object coordinate : coordinates) {
            builder.add(coordinate.getClass());
        }
        return builder.build();
    }

    public static <T> Class<T> classOf(T object) {
        @SuppressWarnings("unchecked")
        /* This cast is always safe, right? */
        Class<T> toReturn = (Class<T>) object.getClass();
        return toReturn;
    }

}