JAVA基础-反射复习笔记

JAVA基础-反射 复习笔记

一、什么是反射

  • 在程序正在运行的状态下,动态地获取对象和类的信息动态地调用他们的方法的机制,称之为反射。
  • 例如我们正在写程序的时候,我们一旦写下了要调用某个类的某个方法,源代码编译运行以后,他就按照我们写的代码严格执行。而反射就是java给我们提供的一种在程序运行中依然可以动态获取类信息和运行其方法的机制。

二、反射有什么用

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时获取任意一个类的信息:所具有的成员变量和方法;
  • 在运行时调用任意一个对象的方法;
  • 动态代理。
  • 通俗的讲:反射可以把java类中的各种成分映射成一个个的Java对象。

三、反射是如何实现的

1、对象创建的简要底层原理

  • 1,源代码阶段。demo.java 文件
public class demo {
    public static void main(String[] args) {
        A a1 = new A();
    } 
}
  • 2,编译以后。demo.class字节码文件。
  • 3,jvm会加载demo.class字节码文件,然后创建它的Class类实例对象(如果是静态方法可以直接调用),然后执行方法。
  • 4,运行到 A a1 = new A(); 时,jvm会去本地磁盘(也就是外存)找A.class文件,将它加载到内存,创建一个A的Class类实例对象。
  • 5,通过A的Class对象获得构造方法,再调用构造方法,得到A的实例对象a1。

2、Class类

  • Class类是java类的抽象,就像自定义Student类是学生的抽象、Teacher类是老师的抽象一样。

  • 一个java类的Class类对象中包含了这个java类的属性,方法等信息。

  • 一个java类只会有一个Class类对象。这个对象是jvm创建了,我们无论获取多少次,都是同一个对象。

四、Class类

1、获取某个java类的Class对象。

//获取Class对象的三种方式
@Test
public void t1() throws ClassNotFoundException {

    //1、通过实例对象获取
    Student s1 = new Student();
    Class s1Class = s1.getClass();

    //2、通过类名直接获取
    Class studentClass1 = Student.class;

    //3、通过完整包名获取
    Class studentClass2 = Class.forName("com.example.demo.entity.Student");

}

2、创建类的实例对象

  • 方法
方法说明
public T newInstance();创建对象

3、获取类的属性对象

方法说明
public Field[] getFields()返回类中public修饰的属性对象
public Field[] getDeclaredFields()返回类中所有的属性对象
public Field getDeclaredField(String name)根据属性名name获取指定的属性对象
public Field[] getFields(String name)根据属性名name获取指定的public修饰的属性对象

4、获取类的方法对象

方法说明
public Method[] getMethods()获取所有的public修饰的方法对象
public Method[] getDeclaredMethods()获取所有的方法对象
public Method getMethod(String methodName,Class<?>… parameterTypes)根据方法名、参数类型获取public修饰的方法对象
public Method getDeclaredMethod(String methodName,Class<?>… parameterTypes)根据方法名、参数类型获取方法对象

5、获取类的构造方法对象

方法说明
public Constructor getConstructor(Class<?>… parameterTypes)根据参数类型获取public修饰的构造器对象
public Constructor[] getConstructors()获取所有public修饰的构造器对象
public Constructor getDeclaredConstructor(Class<?>… parameterTypes)根据参数类型获取构造器对象
public Constructor<?>[] getDeclaredConstructors()获取所有构造器对象

五、Field类

属性类

方法说明
public String getName()返回属性名
public int getModifiers()获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
public Class<?> getType()以Class类型,返回属性类型【一般配合Class类的getSimpleName()方法使用】
public void set(Object obj, Object value)设置属性值
public Object get(Object obj)读取属性值

六、Method类

方法类

方法说明
public String getName()返回方法名
public int getModifiers()获取方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
public Class<?> getReturnType()以Class类型,返回方法类型【一般配合Class类的getSimpleName()方法使用】
public Class<?>[] getParameterTypes()返回方法的参数类型列表(一个方法的参数可能会有多个。)【结果集一般配合Class类的getSimpleName()方法使用】
public Object invoke(Object obj, Object… args)调用方法(常用)

七、Constructor类

构造器类

方法说明
public String getName()
public int getModifiers()获取方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号
public Class<?>[] getParameterTypes()
public T newInstance(Object … initargs)创建对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值