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

     

  • 相关阅读:
    调用同一个类的另一个方法,导致该方法的事物失效问题。。做记录
    JS点名功能
    JS复制功能
    js局部刷新
    基于 Token 的身份验证方法
    JS获取URL“#”后的值
    JS批量打包下载图片(笔记)
    九阴真经
    弹框播放腾讯视频(Iframe)
    js sessionStorage会话存取/删除
  • 原文地址:https://www.cnblogs.com/SQP51312/p/6141586.html
Copyright © 2011-2022 走看看