反射的概述以及获取字节码Class对象的三种方式

什么是反射:

反射是一种行为,发生在程序运行时,当你查看程序集数据或者元数据的时候

反射机制:是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,是一种动态获取的信息以及动态调用对象的方法的功能。

反射有什么用:

可以通过反射获取类中的方法、字段、属性、子类

什么时候用到反射:

简单的说反射是为了动态地运行时加载,而静态代码是在编译时就确定好了。也就是说当你的程序需要在运行时再做一些晚绑定,动态加载或检查对象等操作时,你就需要用到反射。

反射(Reflection)有下列用途:

  • 它允许在运行时查看属性(attribute)信息。
  • 它允许审查集合中的各种类型,以及实例化这些类型。
  • 它允许延迟绑定的方法和属性(property)。
  • 它允许在运行时创建新类型,然后使用这些类型执行一些任务  

反射的优点和缺点:

优点:提高程序的灵活性与可扩展性,降低代码的耦合性

缺点:

1. 过多使用,会造成逻辑模糊,因为反射已经绕过的源码,看不到逻辑实现,会造成后期维护上的困扰。

2. 性能的问题,主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。

反射:框架设计的灵魂

框架:半成品软件,可以在框架的基础上进行软件开发,简化编码

反射:将类的各个组成部分封装成其他对象,这就是反射机制

 好处:

  1.可以在程序运行中,操作这些对象

  2.可以解耦,提高程序的可扩展性。

 

 

获取字节码Class对象的三种方式

1、Class.forName("全类名"):将字节码文件加载进内存,返回Class对象

  多用于配置文件,将类名定义在配置文件中。读取文件,加载类

2、类名.class:通过类名的属性class获取

  多用于参数的传递

3、对象.getClass():getClass()方法在Object类中定义着。

  多用于对象的获取字节码的方式

 

/*
    反射 获取字节码Class对象的三种方式:
    获取class对象的方式:
        1.Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
        2.类名.class:通过类名的属性class获取
        3.对象.getclass():getClass()方法在object类中定义着
    结论:
        同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个

 */
public class demo01 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //1.Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
        Class<?> cls = Class.forName("com.abstract_01.denG_016.DenG_01.Person");
        System.out.println(cls);

        //2.类名.class
        Class<Person> cls2 = Person.class;
        System.out.println(cls2);

        //3.对象.getClass()
        Person p = new Person();
        Class<? extends Person> cls3 = p.getClass();
        System.out.println(cls3);

        //==比较三个对象
        System.out.println(cls==cls2);
        System.out.println(cls==cls3);

    }
}

运行结果:

 

posted @ 2022-08-25 15:56  monkey大佬  阅读(236)  评论(0)    收藏  举报