Class类特点和方法

300 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情

Class类

介绍

(1)Class也是类,因此也要继承Object类

图片.png

(2)Class类对象不是new出来的,而是系统创建的

(3)对于某个类的Class类对象,在内存中只有一份,因为类只加载一次

(4)每个类的实例都会记得自己是由哪个Class实例所生成的

(5)通过Class对象可以完整的得到一个类的完整结构,通过一系列API

(6)Class对象是存放在堆的

(7)类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等等)

对Class类特点的梳理

import com.hspedu.Cat;
import java.util.ArrayList;

public class Class01 {
    public static void main(String[] args) throws ClassNotFoundException {
        
        //1. Class 也是类,因此也继承 Object 类
        //2. Class 类对象不是 new 出来的,而是系统创建的
        //(1) 传统 new 对象
        /* ClassLoader 类
            public Class<?> loadClass(String name) throws ClassNotFoundException {
                return loadClass(name, false);
            }
        */
        //Cat cat = new Cat();
        //(2) 反射方式, 刚才老师没有 debug 到 ClassLoader 类的 loadClass, 原因是,我没有注销 Cat cat = new Cat();
        /*
            ClassLoader 类, 仍然是通过 ClassLoader 类加载 Cat 类的 Class 对象
            public Class<?> loadClass(String name) throws ClassNotFoundException {
                return loadClass(name, false);
            }
        */
        Class cls1 = Class.forName("com.hspedu.Cat");
        //3. 对于某个类的 Class 类对象,在内存中只有一份,因为类只加载一次
        Class cls2 = Class.forName("com.hspedu.Cat");
        System.out.println(cls1.hashCode());
        System.out.println(cls2.hashCode());
        Class cls3 = Class.forName("com.hspedu.Dog");
        System.out.println(cls3.hashCode());
    }
}

Class类的方法

Class (Java Platform SE 6)

<U> Class<? extends U>asSubclass(Class<U> clazz)           强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。
 Tcast(Object obj)           将一个对象强制转换成此 Class 对象所表示的类或接口。
 booleandesiredAssertionStatus()           如果要在调用此方法时将要初始化该类,则返回将分配给该类的断言状态。
static Class<?>forName(String className)           返回与带有给定字符串名的类或接口相关联的 Class 对象。
static Class<?>forName(String name, boolean initialize, ClassLoader loader)           使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。
<A extends Annotation> AgetAnnotation(Class<A> annotationClass)           如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
 Annotation[]getAnnotations()           返回此元素上存在的所有注释。
 StringgetCanonicalName()           返回 Java Language Specification 中所定义的底层类的规范化名称。
 Class<?>[]getClasses()           返回一个包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口。
 ClassLoadergetClassLoader()           返回该类的类加载器。
 Class<?>getComponentType()           返回表示数组组件类型的 Class
 Constructor<T>getConstructor(Class<?>... parameterTypes)           返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
 Constructor<?>[]getConstructors()           返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
 Annotation[]getDeclaredAnnotations()           返回直接存在于此元素上的所有注释。
 Class<?>[]getDeclaredClasses()           返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口。
 Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes)           返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
 Constructor<?>[]getDeclaredConstructors()           返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
 FieldgetDeclaredField(String name)           返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
 Field[]getDeclaredFields()           返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
 MethodgetDeclaredMethod(String name, Class<?>... parameterTypes)           返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
 Method[]getDeclaredMethods()           返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
 Class<?>getDeclaringClass()           如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。
 Class<?>getEnclosingClass()           返回底层类的立即封闭类。
 Constructor<?>getEnclosingConstructor()           如果该 Class 对象表示构造方法中的一个本地或匿名类,则返回 Constructor 对象,它表示底层类的立即封闭构造方法。
 MethodgetEnclosingMethod()           如果此 Class 对象表示某一方法中的一个本地或匿名类,则返回 Method 对象,它表示底层类的立即封闭方法。
 T[]getEnumConstants()           如果此 Class 对象不表示枚举类型,则返回枚举类的元素或 null。
 FieldgetField(String name)           返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
 Field[]getFields()           返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
 Type[]getGenericInterfaces()           返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。
 TypegetGenericSuperclass()           返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
 Class<?>[]getInterfaces()           确定此对象所表示的类或接口实现的接口。
 MethodgetMethod(String name, Class<?>... parameterTypes)           返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
 Method[]getMethods()           返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
 intgetModifiers()           返回此类或接口以整数编码的 Java 语言修饰符。
 StringgetName()           以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
 PackagegetPackage()           获取此类的包。
 ProtectionDomaingetProtectionDomain()           返回该类的 ProtectionDomain
 URLgetResource(String name)           查找带有给定名称的资源。
 InputStreamgetResourceAsStream(String name)           查找具有给定名称的资源。
 Object[]getSigners()           获取此类的标记。
 StringgetSimpleName()           返回源代码中给出的底层类的简称。
 Class<? super T>getSuperclass()           返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class
 TypeVariable<Class<T>>[]getTypeParameters()           按声明顺序返回 TypeVariable 对象的一个数组,这些对象表示用此 GenericDeclaration 对象所表示的常规声明来声明的类型变量。
 booleanisAnnotation()           如果此 Class 对象表示一个注释类型则返回 true。
 booleanisAnnotationPresent(Class<? extends Annotation> annotationClass)           如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
 booleanisAnonymousClass()           当且仅当底层类是匿名类时返回 true
 booleanisArray()           判定此 Class 对象是否表示一个数组类。
 booleanisAssignableFrom(Class<?> cls)           判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。
 booleanisEnum()           当且仅当该类声明为源代码中的枚举时返回 true。
 booleanisInstance(Object obj)           判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
 booleanisInterface()           判定指定的 Class 对象是否表示一个接口类型。
 booleanisLocalClass()           当且仅当底层类是本地类时返回 true
 booleanisMemberClass()           当且仅当底层类是成员类时返回 true
 booleanisPrimitive()           判定指定的 Class 对象是否表示一个基本类型。
 booleanisSynthetic()           如果此类是复合类,则返回 true,否则 false
 TnewInstance()           创建此 Class 对象所表示的类的一个新实例。
 StringtoString()           将对象转换为字符串。

Class类常用方法案例

import com.hspedu.Car;
import java.lang.reflect.Field;

public class Class02 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        String classAllPath = "com.hspedu.Car";
        
        //1 . 获取到 Car 类 对应的 Class 对象
        //<?> 表示不确定的 Java 类型
        Class<?> cls = Class.forName(classAllPath);
        
        //2. 输出 cls
        System.out.println(cls); //显示 cls 对象, 是哪个类的 Class 对象 com.hspedu.Car
        System.out.println(cls.getClass());//输出 cls 运行类型 java.lang.Class
        
        //3. 得到包名
        System.out.println(cls.getPackage().getName());//包名
        
        //4. 得到全类名
        System.out.println(cls.getName());
        
        //5. 通过 cls 创建对象实例
        Car car = (Car) cls.newInstance();
        System.out.println(car);//car.toString()
        
        //6. 通过反射获取属性 brand
        Field brand = cls.getField("brand");
        System.out.println(brand.get(car));//宝马
        
        //7. 通过反射给属性赋值
        brand.set(car, "奔驰");
        System.out.println(brand.get(car));//奔驰
        
        //8 我希望大家可以得到所有的属性(字段)
        System.out.println("=======所有的字段属性====");
        Field[] fields = cls.getFields();
        for (Field f : fields) {
            System.out.println(f.getName());//名称
        }
    }
}