Java 反射机制

什么是反射机制?

Java 反射机制是在运行状态中,

对于任意一个,都能够知道这个类所有属性和方法

对于任意一个对象,都能够调用它的任意一个方法和属性

这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

静态编译动态编译

  • 静态编译:在编译确定类型绑定对象
  • 动态编译运行确定类型绑定对象                                                                                                                                                                                                                                                                                                                                                                                           

反射机制优缺点?

优点运行期类型的判断,动态加载类,提高代码灵活度

缺点性能瓶颈反射相当于一系列解释操作通知JVM要做的事情,性能比直接的java代码要很多。

反射的作用?

Java反射机制主要提供了一下功能:

  1. 在运行时判断任意一个对象所属的类
  2. 在运行时调用任意一个对象的方法,生成动态代理
  3. 在运行时构造任意一个类的对象
  4. 在运行时判断任意一个类所具有的成员变量和方法

假如我们有两个程序员A、B,A写程序的时候,需要使用B所写的类,但B并没完成他所写的类,那么A能否通过编译呢?

答案是 不能的。

利用Java 反射的机制,就可以让A在没有得到B所写类的时候,来完成自身代码的编译

Java 的反射机制知道类的基本结构,这种Java类结构探知的能力,称为Java类的"自审"。

Jcreatot 和 eclipse ,当我们构建出一个对象的时候,去调用该对象的方法和属性编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择,这就是利用了Java反射的原理,是对我们创建对象探知、自审

反射机制的应用场景有哪些?

反射框架设计的灵魂。

在项目开发过程中,很少会直接使用反射机制,但不能说反射机制没有用,

实际上有很多设计、开发都与反射机制有关,例如:

  • 模块化的开发,通过反射去调用对应的字节码,
  • 动态代理设计模式也采用了反射机制,
  • Spring / Hibernate 等框架也大量使用到了反射机制。举例:

       1>在使用JDBC 连接数据库时,使用Class.forName() 通过反射加载数据库驱动程序

       2>Spring 框架用到很多反射机制,最经典的是xml 的配置模式

           Spring 通过XML配置模式装载Bean 的过程:

  1. 将程序内所有XMLProperties 配置文件加载入内存
  2. Java类里面解析xml  properties 里面的内容,得到对应实体类的字节码字符串以及相关的属性信息
  3. 使用反射机制,根据这个字符串获得某个类的Class 实例
  4. 动态配置实例的属性

Java 获取反射的三种方法?

  1. 通过new 对象实现反射机制
  2. 通过路径实现反射机制
  3. 通过类名实现反射机制
public class Student {
    private int id;
    String name;
    protected boolean sex;
    public float score;
}

public class Get {
    //获取反射机制三种方式
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一(通过建立对象)
        Student stu = new Student();
        Class classobj1 = stu.getClass();
        System.out.println(classobj1.getName());

        //方式二(所在通过路径-相对路径)
        Class classobj2 = Class.forName("fanshe.Student");
        System.out.println(classobj2.getName());

        //方式三(通过类名)
        Class classobj3 = Student.class;
        System.out.println(classobj3.getName());
    }
}

你可能感兴趣的:(Java基础面试题,java,jvm,开发语言)