Java Tutorial/Reflection/Class

Материал из Java эксперт
Версия от 15:19, 31 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Class comparator: compare and sort classes and their superclasses.

/* 
 * JCommon : a free general purpose class library for the Java(tm) platform
 * 
 *
 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
 * 
 * Project Info:  http://www.jfree.org/jcommon/index.html
 *
 * This library is free software; you can redistribute it and/or modify it 
 * under the terms of the GNU Lesser General Public License as published by 
 * the Free Software Foundation; either version 2.1 of the License, or 
 * (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
 * USA.  
 *
 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
 * in the United States and other countries.]
 *
 * --------------------
 * ClassComparator.java
 * --------------------
 * (C)opyright 2003-2005, by Thomas Morgner and Contributors.
 *
 * Original Author:  Thomas Morgner (taquera@sherito.org);
 * Contributor(s):   David Gilbert (for Object Refinery Limited);
 *
 * $Id: ClassComparator.java,v 1.3 2005/10/18 13:24:19 mungady Exp $
 *
 * Changes
 * -------
 * 02-May-2003 : Initial version
 * 
 */
import java.io.Serializable;
import java.util.ruparator;
/**
 * The class comparator can be used to compare and sort classes and their
 * superclasses. The comparator is not able to compare classes which have no
 * relation...
 * 
 * @author Thomas Morgner
 */
public class ClassComparator implements Comparator, Serializable {
  /** For serialization. */
  private static final long serialVersionUID = -5225335361837391120L;
  /**
   * Defaultconstructor.
   */
  public ClassComparator() {
    super();
  }
  /**
   * Compares its two arguments for order. Returns a negative integer, zero, or
   * a positive integer as the first argument is less than, equal to, or greater
   * than the second.
   * 
   * 
   * Note: throws ClassCastException if the arguments" types prevent them from
   * being compared by this Comparator. And IllegalArgumentException if the
   * classes share no relation.
   * 
   * The implementor must ensure that <tt>sgn(compare(x, y)) ==
   * -sgn(compare(y, x))</tt>
   * for all <tt>x</tt> and <tt>y</tt>. (This implies that
   * <tt>compare(x, y)</tt> must throw an exception if and only if
   * <tt>compare(y, x)</tt> throws an exception.)
   * 
   * 
   * The implementor must also ensure that the relation is transitive:
   * <tt>((compare(x, y)&gt;0) &amp;&amp; (compare(y, z)&gt;0))</tt> implies
   * <tt>compare(x, z)&gt;0</tt>.
   * 
   * 
   * Finally, the implementer must ensure that <tt>compare(x, y)==0</tt>
   * implies that <tt>sgn(compare(x, z))==sgn(compare(y, z))</tt> for all
   * <tt>z</tt>.
   * 
   * 
   * It is generally the case, but <i>not</i> strictly required that
   * <tt>(compare(x, y)==0) == (x.equals(y))</tt>. Generally speaking, any
   * comparator that violates this condition should clearly indicate this fact.
   * The recommended language is "Note: this comparator imposes orderings that
   * are inconsistent with equals."
   * 
   * @param o1
   *          the first object to be compared.
   * @param o2
   *          the second object to be compared.
   * @return a negative integer, zero, or a positive integer as the first
   *         argument is less than, equal to, or greater than the second.
   */
  public int compare(final Object o1, final Object o2) {
    final Class c1 = (Class) o1;
    final Class c2 = (Class) o2;
    if (c1.equals(o2)) {
      return 0;
    }
    if (c1.isAssignableFrom(c2)) {
      return -1;
    } else {
      if (!c2.isAssignableFrom(c2)) {
        throw new IllegalArgumentException("The classes share no relation");
      }
      return 1;
    }
  }
  /**
   * Checks, whether the given classes are comparable. This method will return
   * true, if one of the classes is assignable from the other class.
   * 
   * @param c1
   *          the first class to compare
   * @param c2
   *          the second class to compare
   * @return true, if the classes share a direct relation, false otherwise.
   */
  public boolean isComparable(final Class c1, final Class c2) {
    return (c1.isAssignableFrom(c2) || c2.isAssignableFrom(c1));
  }
}





Create new instance

public class StringTest {
    public static void main(String[] args) {
        try {
            String pc = String.class.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}





Demonstrates Dynamic class type checking

/*
 *     file: DynamicTypeChecking.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.ru/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
 ########## DO NOT EDIT ABOVE THIS LINE ########## */
import java.io.Serializable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
 * Demonstrates Dynamic class type checking.
 * 
 * @author 
 * @version $Revision: 1.3 $
 */
public class DynamicTypeChecking {
  /**
   * Demonstrates usage of <tt>isAssignableFrom</tt> on a class object.
   * 
   * @param dataType
   *          The data type to check.
   * 
   * @return The value <tt>true</tt> if the class is a descendant of
   *         <tt>java.lang.Number</tt> or <tt>false</tt> if it isnt.
   */
  public static boolean isNumber(final Class dataType) {
    return Number.class.isAssignableFrom(dataType);
  }
  /**
   * Demonstration Method.
   * 
   * @param args
   *          Command Line arguments.
   */
  public static void main(final String[] args) {
    final Set classes = new HashSet();
    classes.add(Class.class);
    classes.add(Comparable.class);
    classes.add(Serializable.class);
    classes.add(Integer.class);
    classes.add(int.class);
    classes.add(Float[].class);
    classes.add(String.class);
    classes.add(double[].class);
    classes.add(boolean.class);
    System.out.println("Using isAssignableFrom:");
    useAssignable(classes);
    System.out.println("\nUsing isInstance:");
    useIsInstance(classes);
  }
  /**
   * Demonstrates use of <tt>isAssignableFrom</tt> on objects in a set.
   * 
   * @param inputSet
   *          The set to check.
   */
  public static void useAssignable(final Set inputSet) {
    final Iterator iter = inputSet.iterator();
    Object obj = null;
    while (iter.hasNext()) {
      obj = iter.next();
      if (obj != null) {
        if (Number.class.isAssignableFrom(obj.getClass())) {
          System.out.println(obj);
        }
      }
    }
  }
  /**
   * Demonstrates usage of <tt>isInstance</tt> on objects in a set.
   * 
   * @param inputSet
   *          The set to check.
   */
  public static void useIsInstance(final Set inputSet) {
    final Iterator iter = inputSet.iterator();
    Object obj = null;
    while (iter.hasNext()) {
      obj = iter.next();
      if (Number.class.isInstance(obj)) {
        System.out.println(obj);
      }
    }
  }
  /**
   * Demonstration method for class comparison based on passed class and object.
   * 
   * @param dataType
   *          The data type to check.
   * @param inputSet
   *          The input set to check.
   * 
   * @throws NullPointerException
   *           If the data type given is null.
   */
  public static void useIsInstance2(final Class dataType, final Set inputSet) {
    if (dataType == null) {
      throw new NullPointerException();
    }
    final Iterator iter = inputSet.iterator();
    Object obj = null;
    while (iter.hasNext()) {
      obj = iter.next();
      if (dataType.isInstance(obj)) {
        System.out.println(obj);
      }
    }
  }
  /**
   * A bad version of useInstance. If you uncomment this method you will get a
   * compiler error.
   */
  // public static void useIsInstance3(final Class dataType, final Set inputSet)
  // {
  // final Iterator iter = inputSet.iterator();
  // Object obj = null;
  // while (iter.hasNext()) {
  // obj = iter.next();
  // if (obj instanceof dataType) {
  // System.out.println(obj);
  // }
  // }
  // }
}
/* ########## End of File ########## */





Demonstrates fetching nested class info from a Class object

/*
 *     file: NestedInfoDemo.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.ru/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
########## DO NOT EDIT ABOVE THIS LINE ########## */

import java.util.Arrays;
import javax.swing.JTable;
/**  
 * Demonstrates fetching nested class info from a Class object.
 *
 * @author 
 * @version $Revision: 1.3 $
 */
public class NestedInfoDemo {
  /** 
   * Demo method.
   *
   * @param args Command line arguments.
   */
  public static void main(final String[] args) {
    printMemberClasses(JTable.class);
  }
  /** 
   * Printo out member information for a class.
   *
   * @param dataType The class to work with.
   */
  public static void printMemberClasses(final Class dataType) {
    final Class[] nestedClasses = dataType.getClasses();
    final Class[] declaredNestedClasses = dataType.getDeclaredClasses();
    final Class[] nestedInterfaces = dataType.getInterfaces();
    final Class declaringClass = dataType.getDeclaringClass();
    // --
    System.out.println("Member Class infor for: " + dataType.getName());
    System.out.println("Nested Classes: " + Arrays.asList(nestedClasses));
    System.out.println("Declared Nested Classes: "
                       + Arrays.asList(declaredNestedClasses));
    System.out.println("Interfaces: " + Arrays.asList(nestedInterfaces));
    System.out.println("Declaring Class: " + declaringClass);
    System.out.println();
  }
}
/* ########## End of File ########## */





Demonstrates getting immediate superclass info

/*
 *     file: SuperclassInfoDemo.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.ru/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
########## DO NOT EDIT ABOVE THIS LINE ########## */

import java.util.Set;
import javax.swing.JDialog;
/**  
 * Demonstrates getting immediate superclass info.
 *
 * @author 
 * @version $Revision: 1.3 $
 */
public class SuperclassInfoDemo {
  /** 
   * Demon method.
   *
   * @param args Command line arguments.
   */
  public static void main(final String[] args) {
    System.out.println("JDialog --|> " + JDialog.class.getSuperclass());
    System.out.println("Integer --|> " + Integer.class.getSuperclass());
    System.out.println("Object --|> " + Object.class.getSuperclass());
    System.out.println("int --|> " + int.class.getSuperclass());
    System.out.println("int[] --|> " + int[].class.getSuperclass());
    System.out.println("Set --|> " + Set.class.getSuperclass());
    System.out.println("Comparable --|> " + Comparable.class.getSuperclass());
  }
}
/* ########## End of File ########## */





Demonstrates how to get declaration information on a Class

/*
 *     file: DeclarationInfoDemo.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.ru/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
########## DO NOT EDIT ABOVE THIS LINE ########## */

import java.lang.reflect.Modifier;
import java.util.Collection;

/**  
 * Demonstrates how to get declaration information on a Class.
 *
 * @author 
 * @version $Revision: 1.3 $
 */
public class DeclarationInfoDemo {
  /** 
   * Demonstration Method.
   *
   * @param args Command line arguments.
   */
  public static void main(final String[] args) {
    printModifiers(Object.class);
    printModifiers(Float.class);
    printModifiers(Collection.class);
    printModifiers(int.class);
    printModifiers(String.class);
  }
  /** 
   * Prints out the modifiers for a class.
   *
   * @param dataType The class for which to print out modifiers.
   */
  public static void printModifiers(final Class dataType) {
    final int modifiers = dataType.getModifiers();
    if (Modifier.isPrivate(modifiers)) {
      System.out.print("private ");
    }
    if (Modifier.isPrivate(modifiers)) {
      System.out.print("private ");
    }
    if (Modifier.isPublic(modifiers)) {
      System.out.print("private ");
    }
    if (Modifier.isAbstract(modifiers)) {
      System.out.print("abstract ");
    }
    if (Modifier.isFinal(modifiers)) {
      System.out.print("final ");
    }
    if (Modifier.isNative(modifiers)) {
      System.out.print("native ");
    }
    if (Modifier.isInterface(modifiers)) {
      System.out.print("interface ");
    }
    if (Modifier.isStatic(modifiers)) {
      System.out.print("static ");
    }
    if (Modifier.isStrict(modifiers)) {
      System.out.print("strict ");
    }
    if (Modifier.isSynchronized(modifiers)) {
      System.out.print("synchronized ");
    }
    if (Modifier.isTransient(modifiers)) {
      System.out.print("transient ");
    }
    if (Modifier.isVolatile(modifiers)) {
      System.out.print("volatile ");
    }
    System.out.println(dataType.getName());
  }
}
/* ########## End of File ########## */





Demonstrates how to set public field objects

/*
 *     file: HiddenFieldModification.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.ru/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
 ########## DO NOT EDIT ABOVE THIS LINE ########## */
import java.lang.reflect.Field;
/**
 * Demonstrates how to set public field objects.
 * 
 * @author 
 * @version $Revision: 1.3 $
 */
public class HiddenFieldModification {
  /**
   * Sets all int fields in an object to 0.
   * 
   * @param obj
   *          The object to operate on.
   * 
   * @throws RuntimeException
   *           If there is a reflection problem.
   */
  public static void initIntFields(final Object obj) {
    try {
      Field[] fields = obj.getClass().getDeclaredFields();
      for (int idx = 0; idx < fields.length; idx++) {
        if (fields[idx].getType() == int.class) {
          fields[idx].setAccessible(true);
          fields[idx].setInt(obj, 0);
        }
      }
    } catch (final IllegalAccessException ex) {
      throw new RuntimeException(ex);
    }
  }
  /**
   * Demo Method.
   * 
   * @param args
   *          Command line arguments.
   */
  public static final void main(final String[] args) {
    Integer value = new Integer("123");
    System.out.println("Before: " + value);
    initIntFields(value);
    System.out.println("After: " + value);
  }
}
/* ########## End of File ########## */





Demonstrates the use of getDeclaringClass()

/*
 *     file: DeclaringClassDemo.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.ru/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
########## DO NOT EDIT ABOVE THIS LINE ########## */
//package oreilly.hcj.reflection;
import java.lang.reflect.Method;
/**  
 * Demonstrates the use of <tt>getDeclaringClass()</tt>.
 *
 * @author 
 * @version $Revision: 1.3 $
 */
public class DeclaringClassDemo {
  /** 
   * Demo method.
   *
   * @param args Command line arguments.
   */
  public static void main(final String[] args) {
    Method[] methods = String.class.getMethods();
    for (int idx = 0; idx < methods.length; idx++) {
      System.out.println(methods[idx] + " declared by "
                         + methods[idx].getDeclaringClass());
    }
  }
}
/* ########## End of File ########## */





Demonstrates the use of instance comparisons

/*
 *     file: InstanceOfDemo.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.ru/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
 ########## DO NOT EDIT ABOVE THIS LINE ########## */
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.swing.JPanel;
/**
 * Demonstrates the use of instance comparisons.
 * 
 * @author 
 * @version $Revision: 1.3 $
 */
public class InstanceOfDemo {
  /** A set of demon objects. */
  public static final Set OBJECT_SET;
  static {
    Set objectSet = new HashSet();
    objectSet.add(new Integer(5));
    objectSet.add(new String("Hardcore Java"));
    objectSet.add(new Float(22.5f));
    objectSet.add(new JPanel());
    objectSet.add(new Character("x"));
    objectSet.add(new ArrayList());
    objectSet.add(new Double(354.5676));
    objectSet.add(null);
    OBJECT_SET = Collections.unmodifiableSet(objectSet);
  }
  /**
   * Demo method.
   * 
   * @param args
   *          Command Line arguments.
   */
  public static void main(final String[] args) {
    final Iterator iter = OBJECT_SET.iterator();
    Object obj = null;
    while (iter.hasNext()) {
      obj = iter.next();
      if (obj instanceof Number) {
        System.out.println(obj);
      }
    }
  }
}
/* ########## End of File ########## */





Demonstrates usage of various class information methods

/*
 *     file: ClassInfoDemo.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.ru/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
########## DO NOT EDIT ABOVE THIS LINE ########## */

import java.io.Serializable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**  
 * Demonstrates usage of various class information methods.
 *
 * @author 
 * @version $Revision: 1.3 $
 */
public class ClassInfoDemo {
  /** 
   * Demonstration Method
   *
   * @param args Demonstration Method.
   */
  public static void main(final String[] args) {
    final Set classes = new HashSet();
    classes.add(Class.class);
    classes.add(Comparable.class);
    classes.add(Serializable.class);
    classes.add(Integer.class);
    classes.add(int.class);
    classes.add(Float[].class);
    classes.add(String.class);
    classes.add(double[].class);
    classes.add(boolean.class);
    // --
    System.out.println("Finding interface Class objects in the set.");
    Iterator iter = classes.iterator();
    while (iter.hasNext()) {
      useIsInterface((Class)iter.next());
    }
    System.out.println("\nFinding primitive Class objects in the set.");
    iter = classes.iterator();
    while (iter.hasNext()) {
      useIsPrimitive((Class)iter.next());
    }
    System.out.println("\nFinding array Class objects in the set.");
    iter = classes.iterator();
    while (iter.hasNext()) {
      useIsArray((Class)iter.next());
    }
  }
  /** 
   * Demonstrates usage of <tt>isArray</tt> from Class.
   *
   * @param dataType The data type to check.
   *
   * @throws NullPointerException If the user passes null for dataType.
   */
  public static void useIsArray(final Class dataType) {
    if (dataType == null) {
      throw new NullPointerException();
    }
    if (dataType.isArray()) {
      System.out.print(dataType.getName());
      System.out.println("\t ==> " + dataType.getComponentType());
    }
  }
  /** 
   * Demonstrates usage of <tt>isInterface</tt> from Class.
   *
   * @param dataType The data type to check.
   *
   * @throws NullPointerException If the user passes null for dataType.
   */
  public static void useIsInterface(final Class dataType) {
    if (dataType == null) {
      throw new NullPointerException();
    }
    if (dataType.isInterface()) {
      System.out.println(dataType.getName());
    }
  }
  /** 
   * Demonstrates usage of <tt>isPrimitive</tt> from Class.
   *
   * @param dataType The data type to check.
   *
   * @throws NullPointerException If the user passes null for dataType.
   */
  public static void useIsPrimitive(final Class dataType) {
    if (dataType == null) {
      throw new NullPointerException();
    }
    if (dataType.isPrimitive()) {
      System.out.println(dataType.getName());
    }
  }
}
/* ########## End of File ########## */





Demonstration of how to obtain instances of java.lang.Class

/*
 *     file: ObtainingClassInstances.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.ru/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
########## DO NOT EDIT ABOVE THIS LINE ########## */

/**  
 * Demonstration of how to obtain instances of <tt>java.lang.Class</tt>.
 *
 * @author 
 * @version $Revision: 1.3 $
 */
public class ObtainingClassInstances {
  /** An Integer object */
  protected static Integer someInteger = new Integer(10);
  /** A generic object. */
  protected static Object someObject = null;
  /** A String. */
  protected static String someString = new String("Hardcore Java");
  /** An int. */
  protected static int someInt = 15;
  /** An array of ints. */
  protected static int[] intArray = new int[] { 4, 5, 7, 9 };
  /** 
   * Main method.
   *
   * @param args Command line arguments.
   */
  public static void main(final String[] args) {
    // -- Print out the Class instances. 
    System.out.println(someInteger.getClass());
    System.out.println(someString.getClass());
    System.out.println(intArray.getClass());
    System.out.println(Object.class);
    System.out.println(Integer.class);
    System.out.println(int.class);
    System.out.println(String.class);
    System.out.println(Comparable.class);
    System.out.println(Object[].class);
    // -- Things that WON"T work
    // System.out.println(someObject.getClass());  // <= Exception 
    // System.out.println(someInt.getClass()); // <= Compiler errror
  }
  /** 
   * Demonstration of a method that doesnt check for null.
   *
   * @param obj The object passed.
   */
  public void writeClass(final Object obj) {
    System.out.println(obj.getClass());
  }
}
/* ########## End of File ########## */





Determine whether the supplied string represents a well-formed fully-qualified Java classname.

/*
 * JBoss DNA (http://www.jboss.org/dna)
 * See the COPYRIGHT.txt file distributed with this work for information
 * regarding copyright ownership.  Some portions may be licensed
 * to Red Hat, Inc. under one or more contributor license agreements.
 * See the AUTHORS.txt file in the distribution for a full listing of 
 * individual contributors. 
 *
 * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
 * is licensed to you under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * JBoss DNA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;

public class Utils {
  /**
   * Determine whether the supplied string represents a well-formed fully-qualified Java classname. This utility method enforces
   * no conventions (e.g., packages are all lowercase) nor checks whether the class is available on the classpath.
   * 
   * @param classname
   * @return true if the string is a fully-qualified class name
   */
  public static boolean isFullyQualifiedClassname( String classname ) {
      if (classname == null) return false;
      String[] parts = classname.split("[\\.]");
      if (parts.length == 0) return false;
      for (String part : parts) {
          CharacterIterator iter = new StringCharacterIterator(part);
          // Check first character (there should at least be one character for each part) ...
          char c = iter.first();
          if (c == CharacterIterator.DONE) return false;
          if (!Character.isJavaIdentifierStart(c) && !Character.isIdentifierIgnorable(c)) return false;
          c = iter.next();
          // Check the remaining characters, if there are any ...
          while (c != CharacterIterator.DONE) {
              if (!Character.isJavaIdentifierPart(c) && !Character.isIdentifierIgnorable(c)) return false;
              c = iter.next();
          }
      }
      return true;
  }
}





Get Canonical Name for a class

public class GetCanonicalName {
    public static void main(String[] args) {
        System.out.println(Person.class.getCanonicalName()); 
    }
}
////
import javax.ejb.Entity;
import javax.ejb.AccessType;
import javax.ejb.Id;
import javax.ejb.GeneratorType;
import java.io.Serializable;
@Entity(access = AccessType.FIELD)
public class Person implements Serializable {
  @Id(generate = GeneratorType.AUTO)
  Integer id;
  String name;
}





get class from an object

// ClassInfoDemo1.java
class ClassInfoDemo1
{
   public static void main (String [] args)
   {
      String s = "";
      Class c = s.getClass ();
      System.out.println (c.getName ());
      c = new ClassInfoDemo1 ().getClass ();
      System.out.println (c.getName ());
   }
}





Get class name for various object

public class GetName {
    public static void main(String[] args) {
        System.out.println(GetName.class.getName());
        System.out.println(int[].class.getName()); 
        System.out.println(GetName[].class.getName());      
        System.out.println(GetName.class.getPackage()); 
    }
}





Is the Same Signature

//
//$Id: IntrospectionUtil.java 1540 2007-01-19 12:24:10Z janb $
//Copyright 2006 Mort Bay Consulting Pty. Ltd.
//------------------------------------------------------------------------
//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.
//

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
public class Utils {
  public static boolean isSameSignature(Method methodA, Method methodB) {
    if (methodA == null)
      return false;
    if (methodB == null)
      return false;
    List parameterTypesA = Arrays.asList(methodA.getParameterTypes());
    List parameterTypesB = Arrays.asList(methodB.getParameterTypes());
    if (methodA.getName().equals(methodB.getName()) && parameterTypesA.containsAll(parameterTypesB))
      return true;
    return false;
  }
}





Is Type Compatible

//
//$Id: IntrospectionUtil.java 1540 2007-01-19 12:24:10Z janb $
//Copyright 2006 Mort Bay Consulting Pty. Ltd.
//------------------------------------------------------------------------
//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.
//

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
public class Utils {
  public static boolean isTypeCompatible(Class formalType, Class actualType, boolean strict) {
    if (formalType == null && actualType != null)
      return false;
    if (formalType != null && actualType == null)
      return false;
    if (formalType == null && actualType == null)
      return true;
    if (strict)
      return formalType.equals(actualType);
    else
      return formalType.isAssignableFrom(actualType);
  }
}





Returns the name of a class without the package name

public class Utils {
  /**
   * Returns the name of a class without the package name.  For example: if
   * input = "java.lang.Object" , then output = "Object".
   * @param fully qualified classname
   * @return the unqualified classname 
   */
  public static String getShortClassName(final String className) {
      if (className != null) {
          final int index = className.lastIndexOf(".");
          return className.substring(index + 1);
      }
      return null;
  }
}