Java基础-反射-Class

class 类

class(包括interface)的本质是就是一种数据类型(Type),class是由JVM在执行过程中动态加载的。JVM在第一次读取到某种class类型时,将其加载进内存。
每加载一种class,JVM就创建一个对应Class类型的实例,并关联起来。
以String类为例,当JVM加载String类时,它首先读取String.class文件到内存,然后,为String类创建一个Class实例并关联起来.
由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class(Class对象就是一个简单的类,类名为Class,其实例对象记录了某一类的具体信息,对任意的一个Object实例,只要我们获取了它的Class,就可以获取它的一切信息。)的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。
这种通过Class实例获取class信息的方法称为反射(Reflection)。

获取一个Class实例

获取class的Class实例的三个方法:

  • 通过类的静态变量class获取:Class cls = String.class;
  • 通过实例变量的getClass()获取:String s = “Hello”;Class cls = s.getClass();
  • 根据class的全限定名获取:Class cls = Class.forName(“java.lang.String”);

因为Class实例在JVM中是唯一(单例)的,所以,上述方法获取的Class实例是同一个实例。


    @SuppressWarnings("rawtypes")

    public static void main(String[] args) throws ClassNotFoundException {
        // 通过类的静态变量class获取
        Class cls1 = String.class;

        // 通过实例变量的getClass()获取
        String str = "str";
        
        Class cls2 = str.getClass();

        // 通过类的全限定名获取
        Class cls3 = Class.forName("java.lang.String");
        

        // Class对象在JVM中是单例模式的,所以三种方式获取到的Class对象都是同一个对象
        System.out.println(cls1 == cls2); // true
        System.out.println(cls1 == cls3); // true
        System.out.println(cls2 == cls3); // true

    }

通过Class实例创建对应的实例对象


    @SuppressWarnings("rawtypes")

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        Class cls = Class.forName("java.lang.String");

        String str = (String) cls.newInstance(); // == new String();

    }

Class API

Modifier and TypeMethodDescriptionSample Code
<U> Class<? extends U>asSubclass(Class<U> clazz)
Tcast(Object obj)
booleandesiredAssertionStatus()
static Class<?>forName(String className)根据类的全限定名返回类的Class实例Class.forName(“java.lang.String”)
static Class<?>forName(String name, boolean initialize, ClassLoader loader)
AnnotatedType[]getAnnotatedInterfaces()
AnnotatedTypegetAnnotatedSuperclass()
<A extends Annotation> AgetAnnotation(Class<A> annotationClass)
Annotation[]getAnnotations()返回此类对象上存在的注解
<A extends Annotation> A[]getAnnotationsByType(Class<A> annotationClass)
StringgetCanonicalName()
Class<?>[]getClasses()返回类定义的公共的内部类,以及从父类、父接口那里继承来的内部类
ClassLoadergetClassLoader()
Class<?>getComponentType()
Constructor<T>getConstructor(Class<?>… parameterTypes)
Constructor<?>[]getConstructors()
<A extends Annotation> AgetDeclaredAnnotation(Class<A> annotationClass)
Annotation[]getDeclaredAnnotations()
<A extends Annotation> A[]getDeclaredAnnotationsByType(Class<A> annotationClass)
Class<?>[]getDeclaredClasses()返回类中定义的公共、私有、保护的内部类
Constructor<T>getDeclaredConstructor(Class<?>… parameterTypes)
Constructor<?>[]getDeclaredConstructors()
FieldgetDeclaredField(String name)
Field[]getDeclaredFields()
MethodgetDeclaredMethod(String name, Class<?>… parameterTypes)
Method[]getDeclaredMethods()
Class<?>getDeclaringClass()
Class<?>getEnclosingClass()
Constructor<?>getEnclosingConstructor()
MethodgetEnclosingMethod()
T[]getEnumConstants()
FieldgetField(String name)返回指定字段对象
Field[]getFields()返回所有字段对象
Type[]getGenericInterfaces()
TypegetGenericSuperclass()
Class<?>[]getInterfaces()
MethodgetMethod(String name, Class<?>… parameterTypes)返回指定方法对象
Method[]getMethods()返回所有方法对象
intgetModifiers()返回Class对应类(或者接口)的修饰符
StringgetName()返回此类对象所表示类的全限定名
PackagegetPackage()返回此类对象所表示的类所在的包名
ProtectionDomaingetProtectionDomain()
URLgetResource(String name)
InputStreamgetResourceAsStream(String name)
Object[]getSigners()
StringgetSimpleName()返回此对象所表示类的类名
Class<? super T>getSuperclass()返回此对象所表示类的父类对象
StringgetTypeName()
TypeVariable<Class<T>>[]getTypeParameters()
booleanisAnnotation()此类对象是否表示注解类型Class.forName(“javax.xml.ws.ServiceMode”).isAnnotation() //true
booleanisAnnotationPresent(Class<? extends Annotation> annotationClass)
booleanisAnonymousClass()
booleanisArray()此类对象是否表示数组类
booleanisAssignableFrom(Class<?> cls)
booleanisEnum()此类对象是否表示enum类型
booleanisInstance(Object obj)
booleanisInterface()判断当前类对象表示的类是否为接口Class.forName(“javax.xml.ws.ServiceMode”).isInterface() //true
booleanisLocalClass()
booleanisMemberClass()
booleanisPrimitive()
booleanisSynthetic()如果该类是合成类,则返回true;否则返回false。
TnewInstance()创建由这个类对象表示的类的实例对象。String str = (String) Class.forName(“java.lang.String”).newInstance(); // == new String();
StringtoGenericString()返回该class对象所表示的类的修饰符Class.forName(“java.lang.String”).toGenericString(); <br> 结果:public final class java.lang.String
StringtoString()将对象转换为string对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值