zoukankan      html  css  js  c++  java
  • java之Class类详解

    测试中需要用到的代码

    InterfaceA代码:

    package jichu;
    
    interface InterfaceA {
        String s1 = "this is s1 in InterfaceA";
    
        public String method1();
    }

    ClassA代码:

    package jichu;
    
    public class ClassA {
        private String s1 = "this is s1 in ClassA";
        private String s2 = "this is s2 in ClassA";
    
        public String method1() {
            return "this is method1 in ClassA";
        }
    
        public String method2() {
            return "this is method2 in ClassA";
        }
    
        class Inner {
            private String s1 = "this is s1 in Inner";
    
            private String method1() {
                return "this is method1 in Inner";
            }
        }
    }

    ClassB代码: 

    package jichu;
    
    public class ClassB {
    }

    Class

    位置:java.lang包中

    声明public final class Class<T>implements java.io.Serializable, java.lang.reflect.GenericDeclaration,java.lang.reflect.Type,java.lang.reflect.AnnotatedElement

    class 类有final 修饰,可知他不能被子类继承;并且它实现了多个接口。

    类型参数:T - 由此 Class 对象建模的类的类型。例如,String.class 的类型是 Class<String>。如果将被建模的类未知,则使用 Class<?>。

    介绍:Class是一个java中的泛型类型。Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。 

    字段

        private static final int ANNOTATION= 0x00002000;
        private static final int ENUM      = 0x00004000;
        private static final int SYNTHETIC = 0x00001000;

    构造器

        private Class() {}

    构造器是私有的,可知不能通过new创建Class对象。

    如何得到Class类的实例?

    Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

    getName方法

    public String getName()

    以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

    如果此类对象表示一个基本类型或 void,则返回的名字是一个与该基本类型或 void 所对应的 Java 语言关键字相同的String。

    如果此类对象表示一个数组类,则名字的内部形式为:表示该数组嵌套深度的一个或多个 '[' 字符加元素类型名。元素类型名的编码如下:

    类型 编码
    boolean  Z
    byte  B
    char  C
    class or interface  L  classname
    double  D
    float  F
    int  I
    long  J
    short  S

    toString方法

    public String toString()

    重写了Object类的toString方法。

        public String toString() {
            return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
                + getName();
        }

    如果是接口,则返回"interface "+getName();否则如果是基本类型,则返回getName();否则返回"class "+getName()。

     测试:

            Class c1 = ClassA.class;
            System.out.println(c1.toString());// class jichu.ClassA
            Class c2 = InterfaceA.class;
            System.out.println(c2.toString());// interface jichu.InterfaceA
            Class c3 = int.class;
            System.out.println(c3.toString());// int
            Class c4 = int[].class;
            System.out.println(c4.toString());// class [I
            Class c5 = void.class;
            System.out.println(c5.toString());// void
            Class c6 = (new ClassA().new Inner()).getClass();
            System.out.println(c6.toString());// class jichu.ClassA$Inner

    获取Class对象

    forName(String className)

    public static Class<?> forName(String className) 

    返回与带有给定字符串名的类或接口相关联的 Class 对象。

    注意:字符串名必须是全限定名。

    测试:

            Class c = Class.forName("jichu.ClassA");
            System.out.println(c.toString());// class jichu.ClassA

    forName(String name, boolean initialize,ClassLoader loader)

    public static Class<?> forName(String name, boolean initialize,ClassLoader loader)throws ClassNotFoundException

    上一个方法的重载方法,可以指定类名称、加载时是否运行静态区块、指定类加载器。

    类字面值

            Class c = ClassA.class;
            System.out.println(c1.toString());// class jichu.ClassA

    Object中的getClass()

            ClassA c = new ClassA();
            System.out.println(c.getClass().toString());// class jichu.ClassA 

    判断型方法

    public native boolean isInstance(Object obj);

    判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。此方法是 Java 语言 instanceof 运算符的动态等效方法。

    public native boolean isArray();

    判定此 Class 对象是否表示一个数组类。

    public native boolean isPrimitive();

    判定指定的 Class 对象是否表示一个基本类型。

    public native boolean isInterface();

    判定指定的 Class 对象是否表示一个接口类型。

    public boolean isMemberClass();

    当且仅当底层类是成员类时返回 true。

    测试:

            Class c1 = ClassA.class;
            System.out.println(c1.isInstance(new ClassA()));// true
            System.out.println(c1.isInstance(new ClassB()));// false
            Class c2 = InterfaceA.class;
            System.out.println(c2.isInterface());// true
            Class c3 = int.class;
            System.out.println(c3.isPrimitive());// true
            Class c4 = int[].class;
            System.out.println(c4.isArray());// true
            Class c5 = void.class;
            System.out.println(c5.isPrimitive());// true
            Class c6 = (new ClassA().new Inner()).getClass();
            System.out.println(c6.isMemberClass());// true

    获取类型信息

    获取包名

    public Package getPackage()

    返回该类的包,如果存档或基本代码中没有可用的包信息,则返回 null。

    测试:

            Class c1 = ClassA.class;
            Class c2 = int.class;
            System.out.println(c1.getPackage());// package jichu
            System.out.println(c2.getPackage());// null

    获取超类

    public native Class<? super T> getSuperclass();

    此对象所表示的类的超类。

    测试:

            Class c = ClassA.class;
            System.out.println(c.getSuperclass());// class java.lang.Object

    获取修饰符

    public native int getModifiers();

    表示该类修饰符的 int值。

    测试:

            Class c1 = Class.forName("jichu.ClassA");
            Class c2 = Class.forName("jichu.InterfaceA");
            int[] arr = new int[] {};
            Class c3 = arr.getClass();
            System.out.println(c1.getModifiers());// 1
            System.out.println(c2.getModifiers());// 1536
            System.out.println(c3.getModifiers());// 1041

    将返回的int值转换成修饰符:

            System.out.println(Modifier.toString(c1.getModifiers()));// public
            System.out.println(Modifier.toString(c2.getModifiers()));// abstract interface
            System.out.println(Modifier.toString(c3.getModifiers()));// public abstract final

    获取非限定类名

    public String getSimpleName();

    返回源代码中给出的底层类的简称。如果底层类是匿名的则返回一个空字符串。数组的简称即附带 "[]" 的组件类型的简称。

    测试:

            Class c1 = ClassA.class;
            Class c2 = InterfaceA.class;
            Class c3 = int.class;
            Class c4 = int[].class;
            Class c5 = void.class;
            System.out.println(c1.getSimpleName());// ClassA
            System.out.println(c2.getSimpleName());// InterfaceA
            System.out.println(c3.getSimpleName());// int
            System.out.println(c4.getSimpleName());// int[]
            System.out.println(c5.getSimpleName());// void

    获取全限定类名

    public String getCanonicalName();

    返回 Java Language Specification 中所定义的底层类的规范化名称。如果底层类没有规范化名称(即如果底层类是一个组件类型没有规范化名称的本地类、匿名类或数组),则返回 null。

    测试:

            Class c1 = ClassA.class;
            Class c2 = InterfaceA.class;
            Class c3 = int.class;
            Class c4 = int[].class;
            Class c5 = void.class;
            System.out.println(c1.getCanonicalName());//jichu.ClassA
            System.out.println(c2.getCanonicalName());// jichu.InterfaceA
            System.out.println(c3.getCanonicalName());// int
            System.out.println(c4.getCanonicalName());// int[]
            System.out.println(c5.getCanonicalName());// void

    获取所有成员变量

    public Field[] getDeclaredFields() throws SecurityException

    返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。 

    测试:

            Class c = Class.forName("jichu.ClassA");
            Field[] arr = c.getDeclaredFields();
            StringBuffer s = new StringBuffer();
            for (Field f : arr) {
                s.append(Modifier.toString(f.getModifiers()) + " ");
                s.append(f.getType().getSimpleName() + " ");
                s.append(f.getName() + ";
    ");
            }
            System.out.println(s.toString());

    打印:

    private String s1;
    private String s2;

    获取指定名称的成员变量

    public Field getDeclaredField(String name)throws NoSuchFieldException, SecurityException

    返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称。注意,此方法不反映数组类的 length 字段。

    测试:

            Class c = Class.forName("jichu.ClassA");
            Field f = c.getDeclaredField("s2");
            StringBuffer s = new StringBuffer();
            s.append(Modifier.toString(f.getModifiers()) + " ");
            s.append(f.getType().getSimpleName() + " ");
            s.append(f.getName() + ";
    ");
            System.out.println(s.toString());

    打印:

    private String s2;

    获取所有成员方法

    public Method[] getDeclaredMethods() throws SecurityException

    返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

    测试:

            Class c = Class.forName("jichu.ClassA");
            Method[] arr = c.getDeclaredMethods();
            StringBuffer s = new StringBuffer();
            for (Method m : arr) {
                s.append(Modifier.toString(m.getModifiers()) + " ");
                s.append(m.getReturnType().getSimpleName() + " ");
                s.append(m.getName() + ";
    ");
            }
            System.out.println(s.toString());

    打印:

    public String method1;
    public String method2;

    获取指定名称的成员方法

    public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException

    返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。name 参数是一个 String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识该方法的形参类型。如果在某个类中声明了带有相同参数类型的多个方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则返回该方法;否则将从中任选一个方法。

    测试:

            Class c = Class.forName("jichu.ClassA");
            Method m = c.getDeclaredMethod("method1");
            StringBuffer s = new StringBuffer();
            s.append(Modifier.toString(m.getModifiers()) + " ");
            s.append(m.getReturnType().getSimpleName() + " ");
            s.append(m.getName() + ";
    ");
            System.out.println(s.toString());

    打印:

    public String method1;

     

    创建实例

    public T newInstance() throws InstantiationException, IllegalAccessException

    创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。 

    测试:

            Class c = Class.forName("jichu.ClassA");
            ClassA o1 = (ClassA) c.newInstance();
            ClassA o2 = (ClassA) c.newInstance();
            System.out.println(o1.method1());// this is method1 in ClassA
            System.out.println(o1 == o2);// false

     

  • 相关阅读:
    Java Output流写入包装问题
    SpringBoot项目单元测试不经过过滤器问题
    SpringSecurity集成启动报 In the composition of all global method configuration, no annotation support was actually activated 异常
    JWT jti和kid属性的说明
    Maven 排除依赖
    第五章 基因概念的发现
    第三章 孟德尔遗传的拓展
    第二章 孟德尔遗传
    第一章 引言
    GWAS全基因组关联分析
  • 原文地址:https://www.cnblogs.com/SQP51312/p/6141586.html
Copyright © 2011-2022 走看看