• 反射相关的面试题


    1.什么是反射

     

    答:反射就是根据字节码文件, 获得类的信息,字段信息,方法信息等内容, 创建实例,调用方法的技

    术。

     

    Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个

    对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,

    为啥要说是准动态,因为一般而言的动态语言定义是程序运行时, 允许改变程序结构或变量类型,这

    种语言称为动态语言。

    从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。) 语言的一个关

    键性质。

     
    2.怎么实现反射

    (1)定义一个类Person:

    package lqz2.com.cn;

    public class Person {
    //私有属性
    private String name = "李勤珍";
    //公有属性
    public int age = 18;
    //构造方法
    public Person() {
    super();
    }

    //私有方法
    private void say(){
    System.out.println("private say()...");
    }
    //公有方法
    public void run(){
    System.out.println("public run()...");
    }

    }

    (2)得到 Class 的三种方式

    //1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object

    //  类型的对象,而不知道具体是什么类,用这种方法

      Person p1 = new Person();

      Class c1 = p1.getClass();

            

    //2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高

    //  这说明任何一个类都有一个隐含的静态成员变量 class

      Class c2 = Person.class;

            

    //3、通过 Class 对象的 forName() 静态方法来获取,用的最多,

    //   但可能抛出 ClassNotFoundException 异常

      Class c3 = Class.forName("com.ys.reflex.Person");

    注意:一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的 c1,c2,c3进行 equals

    比较,发现都是true。

    (3)通过 Class 类获取成员变量、成员方法、接口、超类、构造方法等。

    Class 有很多方法: 

    getName():获得类的完整名字。
      getFields():获得类的public类型的属性。
      getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
      getMethods():获得类的public类型的方法。
      getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
      getMethod(String name, Class[] parameterTypes):获得类的特定方法,

    name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
      getConstructors():获得类的public类型的构造方法。
      getConstructor(Class[] parameterTypes):获得类的特定构造方法,

    parameterTypes 参数指定构造方法的参数类型。
      newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

     

    3.用在什么地方

     

    答:JDBC原生代码注册驱动,hibernate 的实体类,Spring 的 AOP等等都有反射的实现。

     

    4.反射能够做什么

    答:我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其

    modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用

    methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码

    链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的

    资源消耗!

  • 相关阅读:
    七牛云李意扬:如何收集 Go 实时覆盖率丨ECUG Meetup 回顾
    OpenTelemetry 微服务链路追踪
    空接口
    安全规则集合
    采用最快回应
    Golang单元测试实战
    源码 kratos 配置热加载分析
    烟花 光影
    控制Repeater显示列数
    基本代码安全知识
  • 原文地址:https://www.cnblogs.com/liqinzhen/p/12800896.html
Copyright © 2020-2023  润新知