/* * 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.apache.geode.internal.lang; /** * The ClassUtils class is an abstract utility class for working with and invoking methods on Class * objects. * <p/> * * @see java.lang.Class * @see java.lang.Object * @since GemFire 7.0 */ public abstract class ClassUtils { public static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; /** * Attempts to load the specified class by fully qualified name. If the class could not be found, * then this method handles the ClassNotFoundException and throws the specified RuntimeException * instead. * </p> * * @param className a String indicating the fully qualified name of the class to load. * @param e the RuntimeException to throw in place of the ClassNotFoundException if the class * could not be found and loaded. * @return a Class object representing the specified class by name. * @throws NullPointerException if either className or RuntimeException is null. * @see java.lang.Class#forName(String) */ public static Class forName(final String className, final RuntimeException e) { try { return Class.forName(className); } catch (ClassNotFoundException ignore) { throw e; } catch (NoClassDefFoundError ignore) { throw e; } } /** * Gets the Class type for the specified Object, or returns null if the Object reference is null. * <p/> * * @param obj the Object who's class type is determined. * @return the Class type of the Object parameter, or null if the Object reference is null. * @see java.lang.Object#getClass() */ public static Class getClass(final Object obj) { return (obj == null ? null : obj.getClass()); } /** * Gets the name of the Object's Class type or null if the Object reference is null. * <p/> * * @param obj the Object's who's class name is returned or null if the Object reference is null. * @return a String value specifying the name of the Object's class type. * @see #getClass(Object) * @see java.lang.Class#getName() */ public static String getClassName(final Object obj) { final Class objType = getClass(obj); return (objType == null ? null : objType.getName()); } /** * Determine whether the specified class is on the classpath. < * <p/> * * @param className a String value specifying the fully-qualified name of the class. * @return a boolean value indicating whether the specified class is on the classpath. * @see #forName(String, RuntimeException) */ public static boolean isClassAvailable(final String className) { try { forName(className, new IllegalArgumentException(String.format("Class (%1$s) is not available!", className))); return true; } catch (IllegalArgumentException ignore) { // NOTE the Exception could be logged at fine/debug level if we used category-based logging return false; } } /** * Determines whether the specified Object parameter is an instance of, or is * assignment-compatible with the given Class type. Note, this method is null-safe for both Class * and Object value references. * <p/> * * @param type the Class type used in an instanceof determination with the given Object. * @param obj the Object being determined for assignment-compatibility with the specified Class * type. * @return a boolean value indicating if the given Object is an instance of the specified Class * type. * @see java.lang.Class#isInstance(Object) */ public static boolean isInstanceOf(final Class type, final Object obj) { return (type != null && type.isInstance(obj)); } /** * Determines whether the specified Object is not a instance of the following Class types. The * Object is considered not an instance of the Class types if the condition holds for all Class * types. * <p/> * * @param obj the Object who's Class type is in question. * @param types an array of Class types that the Object is being tested as an instance of. * @return a boolean value of true if the Object is not an instance of any of the specified Class * types. * @see java.lang.Class#isInstance(Object) */ public static boolean isNotInstanceOf(final Object obj, final Class... types) { boolean condition = true; if (types != null) { for (int index = 0; index < types.length && condition; index++) { condition &= !types[index].isInstance(obj); } } return condition; } }