反射的使用

1. 概念

反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的所有成员(成员变量,成员方法,构造方法)

反射是指对于任何一个类,在"运行的时候"都可以直接得到这个类全部成分。

  • 在运行时,可以直接得到这个类的构造器对象。(Constructor)

  • 在运行时,可以直接得到这个类的成员变量对象。(Field)

  • 在运行时,可以直接得到这个类的成员方法对象。(Method)

使用反射操作类成员的前提:要获得该类字节码文件对象,就是Class对象

反射在实际开发中的应用:

  • 开发IDE(集成开发环境),比如IDEA,Eclipse

  • 各种框架的设计和学习 比如Spring,Hibernate,SpringMVC,Mybaits....

总结:

1.反射是工作在运行时的技术,因为只有运行之后才会有class类对象。

2.反射的核心思想和关键就是得到,编译以后的class对象。

3.反射是在运行时获取类的字节码文件对象,然后可以解析类中的全部成分。

2. 获取Class对象的三种方式

2.1 三种获取方法

方式1:   通过类名.class获得

方式2:通过对象名.getClass()方法获得

方式3:通过Class类的静态方法获得: static Class forName("类全名")

每一个类的Class对象都只有一个。

    public static void main(String[] args) throws ClassNotFoundException {
        //1.通过类名.class获取
        //使用场景:已知类名
        Class<Student> clazz1 = Student.class;
        InputStream is= Student.class.getResourceAsStream("abc.txt");
        System.out.println("clazz1="+clazz1);

        //2.通过对象名.getClass()方法获取
        //使用场景:方法中形参类型是Object类型。
        Student stu = new Student();
        Class<? extends Student> clazz2 = stu.getClass();
        System.out.println("clazz2="+clazz2);
        System.out.println(clazz1==clazz2);
        //testObj(stu);


    }
    public static void testObj(Object obj)throws IllegalAccessException, InstantiationException{
        Class<?> clazz = obj.getClass();
        System.out.println(clazz);

        Object o= clazz.newInstance();
        System.out.println(o);

    }

    public static void main(String[] args) throws ClassNotFoundException {
        //1.通过类名.class获取
        //使用场景:已知类名
        Class<Student> clazz1 = Student.class;
        InputStream is= Student.class.getResourceAsStream("abc.txt");
        System.out.println("clazz1="+clazz1);

        //2.通过对象名.getClass()方法获取
        //使用场景:方法中形参类型是Object类型。
        Student stu = new Student();
        Class<? extends Student> clazz2 = stu.getClass();
        System.out.println("clazz2="+clazz2);
        System.out.println(clazz1==clazz2);
        //testObj(stu);

        //3.Class.forName("包名.类名")全类名
        //使用场景:使用Spring框架的XML文件中配置实例bean
        Class<?> clazz3 = Class.forName("com.geek.javaze.ch21.reflect.Student");
        System.out.println("clazz3="+clazz3);
        System.out.println(clazz3==clazz2);

    }
    // public static void testObj(Object obj)throws IllegalAccessException, InstantiationException{
    //     Class<?> clazz = obj.getClass();
    //     System.out.println(clazz);
    //
    //     Object o= clazz.newInstance();
    //     System.out.println(o);
    //
    // }

2.2 Class类常用方法

String getSimpleName(); 获得类名字符串:类名

String getName(); 获得类全名:包名+类名

T newInstance() ; 创建Class对象关联类的对象

    public static void main(String[] ar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值