Java开发从入门到精通(二十):Java的高级技术:反射

(一)Java的反射

反射 注解 动态代理在平时不常用,主要用于编写框架和学习框架的源码
在这里插入图片描述

1.1 认识反射

反射(Reflection)
反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)
反射就是用来做框架的
在这里插入图片描述

1.1.1 反射学什么?

  • 学习获取类的信息、操作它们

具体步骤

  • 1、反射第一步:加载类,获取类的字节码:Class对象
  • 2、获取类的构造器:Constructor对象
  • 3、获取类的成员变量:Field对象
  • 4、获取类的成员方法:Method对象
    在这里插入图片描述

1.2 获取类

  • 1、反射第一步:加载类,获取类的字节码:Class对象
    在这里插入图片描述

获取Class对象的三种方式

  • Classc1=类名.class
  • 调用Class提供方法:public static Class forName(String package);
  • Object提供的方法:public Class getClass();Class c3=对象.getClass();
public class FansheTest {
    public static void main(String[] args) throws Exception {
        Class c1 = Student.class;
        System.out.println(c1.getName());//全类名
        System.out.println(c1.getSimpleName());//简名:Student
        Class c2=Class.forName("com.qianxin.fanshe.Student");
        System.out.println(c1 ==c2);

        Student s=new Student();
        Class c3=s.getClass();
        System.out.println(c3 == c2);
    }
}
com.qianxin.fanshe.Student
Student
true
true

1.3 获取类的构造器

  • 2、获取类的构造器:Constructor对象

Class提供了从类中获取构造器的方法
在这里插入图片描述
getConstructors() 只能获取public修饰的构造器

import org.junit.Test;
import java.lang.reflect.Constructor;
public class TestConstructor {
    @Test
    public void testGetConstructors() {
        //1、反射第一步:必须先得到这个类的Class对象
        Class c = Cat.class;
        // 2、获取类的全部构造器
        Constructor[] constructors = c.getConstructors();// 3、遍历数组中的每个构造器对象
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName() + "--->"
                    + constructor.getParameterCount());
        }

    }
}

getDeclaredConstructors() 只要存在构造器就能拿到

import java.lang.reflect.Constructor;

public class TestConstructor {
    @Test
    public void testGetConstructors() {
        //1、反射第一步:必须先得到这个类的Class对象
        Class c = Cat.class;
        // 2、获取类的全部构造器
        Constructor[] constructors = c.getDeclaredConstructors();// 3、遍历数组中的每个构造器对象
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName() + "--->"
                    + constructor.getParameterCount());
        }

    }
}

getConstructor 获取某个构造器:无参数构造器 getDeclaredConstructor获取有参数构造器

import org.junit.Test;
import java.lang.reflect.Constructor;
    @Test
    public void testGetConstructor()throws Exception {
        //1、反射第一步:必须先得到这个类的Class对象

        Class c = Cat.class;
        // 2、获取某个构造器:无参数构造器
        //Constructor constructor =c.getConstructor();
        Constructor constructor = c.getDeclaredConstructor();
        System.out.println(constructor.getName() + "--->"
                + constructor.getParameterCount());

        // 3、获取有参数构造器
        Constructor constructor2 =
                c.getDeclaredConstructor(String.class, int.class);
        System.out.println(constructor2.getName() + "--->"
                + constructor2.getParameterCount());
    }
}

获取类构造器的作用:依然是初始化一个对象返回
在这里插入图片描述

1.3 获取类的成员变量

  • 3、获取类的成员变量:Field对象

1.4 获取类的成员方法

  • 4、获取类的成员方法:Method对象

1.5 作用、应用场景

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HACKNOE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值