type
status
date
slug
summary
tags
category
icon
password
关于反射原理性的知识可以看看类加载流程,对象实例化流程相关的文章,这里说一下反射的常用使用方法。

获取Class

  • Class.forName
  • ClassA.class
  • classA.getClass

Class常见方法

  • isPrimitive()
    • 是否为基础类型,如int,long,byte,boolean,char,short,double等
  • getFiled()
    • 返回所有public成员变量的field对象,包括从父类继承的field对象
  • getDeclaredField()
    • 返回当前类本身所有的field,包括private的field,但是不包括从父类继承的
  • getMethods()/getMethod()/getDeclaredField()
    • 与上面的Field相同
      getMethods()返回类的所有public方法
      public Method getMethod(String name, Class<?>... parameterTypes)
      后面传的是参数的类型
  • getConstructors()/ getConstructor(Class<?>... parameterTypes)/getDeclaredConstructors()/getDeclaredConstructor()
    • 获取构造方法

Field常用方法

  • get(Object obj)
    • 获取Filed的值,如果不是静态字段,需要传入类的对象,如果是静态字段,传入null或者任何对象都可以.
  • set(Object obj, Object value)
    • 将Object的这个Filed的值设置成value
  • setAccessible(true)
    • 修改之前设置Field可以被访问
  • getType()
    • 返回Filed 的类型class,如果属性是泛型,这个方法只能获取到接口类型,即HashMap<K,V>,只能获取到HashMap
  • getGenericType()
    • 返回属性声明的Type对象,如果是泛型,可以获取到具体的参数类型,不如HashMap<K,V>
  • getName()
    • 获取Field声明的时候的名字
  • getAnnotations()/getDeclearedAnnotation()/getAnnotation()
    • 获取这个Field上的注解
  • getModifiers()
    • 获取Filed上的修饰符,返回的是一个int,需要使用Modifier类才能知道具体的修饰符是什么(public,private,static,final等)
  • isEnumConstant()
    • 判断这个Field是否为枚举类型
  • isSynthetic()
    • 判断这个Filed是否为复合类型,即是否为编译期自动生成的Field

Method常用方法

  • invoke(Object obj, Object... args)
    • 执行该Method,obj是对象(如果是静态方法可以直接传null),args是入参,这个方法返回值总是对象,如果是基本类型,则返回包装类型,比如int返回Integer.

Constructor

  • newInstance(Object ... initargs)
通过构造方法创建对象,传入的参数是构造方法的参数.
Class.newInstance()也可以用来创建对象,它获取的是类的默认构造方法(无参),并存在缓存机制保存实例对象.

Array

反射包中也有一个Array.
  • 创建数组
    • newInstance()
  • setXX
  • getXX
  • getLength()
Java线程池源码分析Java队列
姜康
姜康
一个软件工程师
公告
type
status
date
slug
summary
tags
category
icon
password
🎉博客网站重新制作了🎉
👏欢迎更新体验👏