首页 > 技术文章 > java获取反射机制的三种方式

xiaozhengtongxue 2020-09-30 14:44 原文

背景

今天面试,面试官问了我一个问题,“java中的反射机制是什么,实现反射机制主要有哪几种方式?”,因为做项目的时候没怎么接触过反射机制,所有也没答上来,事后查阅资料后才有一定的了解。

反射机制

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

java获取反射机制的三种方式

建立一个学生类:

public class Student{
    private int id;
    String name;
    protected boolean sex;
    public float score;
}
通过new对象实现反射机制
public class Get{
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一:通过建立对象(即通过对象实例获取)
        Student stu = new Student();
        Class classobj1 = stu.getclass();
        System.out.println(classobj1.getName());
    }
}
通过路径实现反射机制
public class Get{
    public static void main(String[] args) throws ClassNotFoundException {
        //方式二:通过路径实现反射机制
        Class classobj2 = Class.forName("fanshe.Student"); //fanshe.Student表示类的路径
        System.out.println(classobj2.getName());
    }
}
通过类名实现反射机制
public class Get{
    public static void main(String[] args) throws ClassNotFoundException {
        //方式三:通过类名实现反射机制
        Class classobj3 = Student.class;
        System.out.println(classobj3.getName());
    }
}

静态编译和动态编译

  • 静态编译:在编译时确定类型,绑定对象
  • 动态编译:运行时确定类型,绑定对象
反射机制的优缺点
  • 优点:运行期类型的判断,动态加载类,提高代码灵活度
  • 缺点:运行时确定类型,绑定对象
反射的应用场景

反射是框架设计的灵魂。
虽然在平时的项目开发中可能很少会使用到反射机制,但这不能说明反射机制没有用,事实上很多设计和开发都与反射机制有关,如模块化的开发,会通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制。还有一些场景如下:

  • 在使用JDBC连接数据库时,会使用Class.forName()通过反射来加载数据库的驱动程序;
  • Spring框架的IOC(动态加载管理Bean)创建对象以及AOP(动态代理)功能都和反射机制有关系;
  • 动态配置实例的属性;
  • ...

推荐阅读