Java JDK Class

来源:互联网 发布:gif在线截取软件 编辑:程序博客网 时间:2024/05/17 22:17

我们都知道在Java的世界里,一切皆对象都是类。那么类又是什么类型?所有Class就是所有类的类型,而Class本身也是一个类。而Class的类类型也是Class。这样也形成了一个完成的循环,大一统。

1、Class简介

类类的实例表示在运行Java应用程序的类和接口.enum是一种class,annotation是一种interface.每个Array同样属于一个class.Java中的原始类型(boolean, byte, char, short, int, long, float和double)和void关键字同样代表Class对象。

Class没有public类型的构造器。在Java虚拟机加载或者ClassLoader调用defineClass的时候会自动构造Class对象。

下面的例子用Class对象来打印一个对象的类名。

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

还可以使用一个类文字得到一个命名的类对象类型.例如:

System.out.println("The name of class Foo is: "+Foo.class.getName());

2、Class方法及说明

Modifier and Type Method Description [U> Class[? extends U> asSubclass(Class[U> clazz) 转换为指定类的子类型 T cast(Object obj) 转换这个类为指定Class类型的Class或者接口 boolean desiredAssertionStatus() 如果被初始化时调用该方法返回将分配给这个类的断言状态 static Class[?> forName(String className) 返回给定字符串的类或接口的名称的类对象 static Class[?> forName(String name, boolean initialize, ClassLoader loader) 使用给定的classloader返回给定字符串的类或接口的名称的类对象 [A extends Annotation> A getAnnotation(Class[A> annotationClass) 如果存在这样一个注解,返回该元素指定类型的注解,否则为空 String getCanonicalName() 返回底层所定义的Java语言规范的规范名称类 Class[?>[] getClasses() 返回一个数组,其中包含类对象代表所有成员的公共类和接口的类为代表的这类对象 ClassLoader getClassLoader() 返回当前类的classloader Class[?> getComponentType() 返回这个数组组件的类类型 Constructor[T> getConstructor(Class[?>… parameterTypes) 返回包含所有给定参数类型的构造器对象 Constructor[?>[] getConstructors() 返回当前对象所有的public类型的构造器对象 Annotation[] getDeclaredAnnotations()(和访问权限无关) 返回当前对象声明的所有注解 Class[?>[] getDeclaredClasses() 返回当前类中声明的类类型 Constructor[T> getDeclaredConstructor(Class… parameterTypes) 返回反映了构造函数所表示的类或接口的指定这个类对象一个构造函数对象(和访问权限无关) Constructor[?>[] getDeclaredConstructors() 返回对象反映所有类的构造函数声明为代表的这类对象的构造函数一个数组 Field getDeclaredField(String name) 返回当前类给定name的Field Field[] getDeclaredFields() 返回当前类所有声明的对象(和访问权限无关) Method getDeclaredMethod(String name, Class[?>… parameterTypes) 返回当前类给定name,给定参数列表的Method对象(和访问权限无关) Method[] getDeclaredMethods() 返回当前类声明的所有方法(和访问权限无关) Class[?> getDeclaringClass() 如果这个类对象所表示的类或接口是另一个类的成员,返回表示类被声明的类对象 Class[?> getEnclosingClass() 返回底层阶级的立即封闭类 Constructor[?> getEnclosingConstructor() 如果这类对象代表了一个本地或匿名类在一个构造函数,返回一个构造函数对象代表立即封闭底层类的构造函数 Method getEnclosingMethod() 如果这类对象代表了一个本地或匿名类在一个构造函数,返回一个构造函数对象代表立即封闭底层类的构造函数 T[] getEnumConstants() 返回元素的枚举类或如果这类对象并不代表一个枚举类型,返回null Field getField(String name) 返回类中该name的Field Field[] getFields() 返回类中所有的Field Type[] getGenericInterfaces() 返回类型代表接口直接由该对象所表示的类或接口实现 Type getGenericSuperclass() 返回类型代表的直接超类实体(类,接口,原始类型或Void)由这个类表示 Class[?>[] getInterfaces() 确定由这个对象所表示的类或接口实现了接口 Method getMethod(String name, Class… parameterTypes) 返回当前类名称为name,指定参数列表的方法 Method[] getMethods() 获取包括自身和继承过来的所有的public方法 int getModifiers() 返回类或接口的Java语言修饰符,编码是一个整数 String() getName() 返回这类对象的实体的名称(数组类,接口,类、原始类型或空白)为一个字符串 Package getPackage() 获取当前类的package ProtectionDomain getProtectionDomain 返回该类的保护Domain URL getResource(String name) 查找一个给定名称的资源 InputStream getResourceAsStream(String name) 查找一个给定名称的资源 Object[] getSigners() 这个类的签名 String getSimpleName() 返回在源代码中给出底层类的简单的名称 Class[? super T> getSuperclass() 返回类代表实体的超类(类,接口,原始类型或空白)由这个类表示 TypeVariable[Class[T>>[] getTypeParameters() 返回一个按声明顺序的TypeVariable对象数组表示泛型声明的变量类型声明由GenericDeclaration对象 boolean isAnnotation() 返回true,如果这类对象代表了一个注释类型 boolean isAnnotationPresent(Class[? extends Annotation> annotationClass) 返回true,如果指定类型的注释出现在这个元素,其他的错误的 boolean isAnonymousClass() 返回true当且仅当底层类是一个匿名类 boolean isArray() 确定是否这类对象表示一个数组类 boolean isAssignableFrom(Class[?> cls) 确定这类对象所表示的类或接口是一样的,或者是一个超类或超接口,指定的类所表示的类或接口参数 boolean isEnum() 返回true当且仅当这个类声明为enum的源代码 boolean isInstance(Object obj) 确定指定的对象是否由当前对象的实例 boolean isInterface() 确定指定的类对象代表一个接口类型 boolean isLocalClass() 返回true当且仅当底层类是一个Local类 boolean isMemberClass() 返回true当且仅当底层类是一个类成员 boolean isPrimitive() 确定指定的类对象是否代表一个原始类型 boolean isSynthetic() 返回true,如果这类是一个合成类;否则返回false T newInstance() 创建一个当前类的一个实例 String toString() 将对象转换为一个字符串

3、常用方法

package com.spring.framework.carl.user.service;import org.junit.Test;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import static org.hamcrest.MatcherAssert.assertThat;import static org.hamcrest.core.Is.is;public class ClassTest {    /**     * 加载类     * @throws ClassNotFoundException     */    @Test    public void testForName() throws ClassNotFoundException {        Class<?> integerClazz = Class.forName("java.lang.Integer");        String integerName = integerClazz.getSimpleName();        assertThat("Integer", is(integerName));    }    /**     * 是否接口     */    @Test    public void testIsInterface(){        boolean isInterface = Map.class.isInterface();        assertThat(true, is(isInterface));        isInterface = HashMap.class.isInterface();        assertThat(false, is(isInterface));    }    /**     * 获取方法     * @throws NoSuchMethodException     */    @Test    public void testMethod() throws NoSuchMethodException {        Method intValue = Integer.class.getMethod("parseInt", String.class);        assertThat("parseInt", is(intValue.getName()));    }    /**     * 创建实例     * @throws IllegalAccessException     * @throws InstantiationException     */    @Test    public void testNewInstance() throws IllegalAccessException, InstantiationException {        Map map = HashMap.class.newInstance();        map.put(1, "carl");        assertThat("carl", is(map.get(1)));    }    /**     * same class or super class or super interface     */    @Test    public void testIsAssignableFrom(){        boolean assignableFrom = Object.class.isAssignableFrom(ArrayList.class);        assertThat(true, is(assignableFrom));        assignableFrom = List.class.isAssignableFrom(ArrayList.class);        assertThat(true, is(assignableFrom));        assignableFrom = ArrayList.class.isAssignableFrom(ArrayList.class);        assertThat(true, is(assignableFrom));    }    /**     * 是否指定类的实例     */    @Test    public void testIsInstance(){        ArrayList arrayList = new ArrayList();        assertThat(true, is(ArrayList.class.isInstance(arrayList)));        assertThat(true, is(List.class.isInstance(arrayList)));    }    /**     * 是否是原始类型     */    @Test    public void test(){        boolean isPrimitive = int.class.isPrimitive();        assertThat(true, is(isPrimitive));        isPrimitive = Integer.class.isPrimitive();        assertThat(false, is(isPrimitive));    }}

4、特殊方法

包括静态方法与可变参数方法两种。

public class ClazzTest {    @Test    public void testInvokeStaticMethod() throws Exception{        // e.g. 1        Class clazz = ClazzTest.class;        Method staticMethod = clazz.getDeclaredMethod("staticMethod");        Object result = staticMethod.invoke(clazz.newInstance());        assertThat("invoke static method fail","invoke static method".equals(result));        // e.g 2        result = staticMethod.invoke(null);        assertThat("invoke static method fail","invoke static method".equals(result));    }    @Test    public void testInvokeVariableParam() throws Exception{        Class clazz = ClazzTest.class;        Method variableParamMethod = clazz.getDeclaredMethod("variableParamMethod", int[].class);        // variableParamMethod.invoke(null, 1, 2, 3, 4) ERROR        Object result = variableParamMethod.invoke(null, new int[]{1, 2, 3 , 4 ,5});        assertThat("invoke variable Param method fail",result.equals(15));    }    public static String staticMethod(){        return "invoke static method";    }    public static Integer variableParamMethod(int ... params){        int result = 0;        for (int param : params) {            result += param;        }        return result;    }}
0 0
原创粉丝点击