Java中Type接口与Class类的区别联系

1.Type定义与说明

源代码:

package java.lang.reflect;

/**
 * Type is the common superinterface for all types in the Java
 * programming language. These include raw types, parameterized types,
 * array types, type variables and primitive types.
 *
 * @since 1.5
 */
public interface Type {
    /**
     * Returns a string describing this type, including information
     * about any type parameters.
     *
     * @implSpec The default implementation calls {@code toString}.
     *
     * @return a string describing this type
     * @since 1.8
     */
    default String getTypeName() {
        return toString();
    }
}

总结来说:

  • Type是一个接口。
  • Type是Java中所有类型的父接口
  • Type包括:raw type(原始类型,对应Class),parameterized types(参数化类型), array types(数组类型), type variables(类型变量) and primitive types(基本类型,对应Class).
  • Type是JDK1.5引入的,主要是为了泛型。

2.Class定义与说明

源代码:

/**
 * Instances of the class {@code Class} represent classes and
 * interfaces in a running Java application.  An enum is a kind of
 * class and an annotation is a kind of interface.  Every array also
 * belongs to a class that is reflected as a {@code Class} object
 * that is shared by all arrays with the same element type and number
 * of dimensions.  The primitive Java types ({@code boolean},
 * {@code byte}, {@code char}, {@code short},
 * {@code int}, {@code long}, {@code float}, and
 * {@code double}), and the keyword {@code void} are also
 * represented as {@code Class} objects.
 *
 * 

{@code Class} has no public constructor. Instead {@code Class} * objects are constructed automatically by the Java Virtual Machine as classes * are loaded and by calls to the {@code defineClass} method in the class * loader. * *

The following example uses a {@code Class} object to print the * class name of an object: * *

 *     void printClassName(Object obj) {
 *         System.out.println("The class of " + obj +
 *                            " is " + obj.getClass().getName());
 *     }
 * 
* *

It is also possible to get the {@code Class} object for a named * type (or for void) using a class literal. See Section 15.8.2 of * The Java™ Language Specification. * For example: * *

* {@code System.out.println("The name of class Foo is: "+Foo.class.getName());} *
* * @param the type of the class modeled by this {@code Class} * object. For example, the type of {@code String.class} is {@code * Class}. Use {@code Class} if the class being modeled is * unknown. * * @author unascribed * @see java.lang.ClassLoader#defineClass(byte[], int, int) * @since JDK1.0 */
public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement { }

总结来说:

  • Class是一个类。
  • Class对象代表着正在运行的Java程序中的类型和接口:enum、annotation、array以及基本类型(8种)都可以用Class对象表示。
  • Class没有public构造器。
  • 当类被加载或者在class loader中被方法调用时,JVM会自动构造Class对象。

3.Type接口与Class类的区别联系

  • TypeClass的父接口。
  • ClassType的子类。

你可能感兴趣的:(Java反射)