美文网首页
java反射机制

java反射机制

作者: going_hlf | 来源:发表于2020-10-30 23:59 被阅读0次

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。“反”,就要先了解“正”。一般先知道类,然后通过类产生实例化对象,而反射是通过对象找类。
反射机制一般用在框架类代码编写,所以平时在框架基础上开发特性时一般用的比较少。
Class类是反射机制的基础。反射机制是跟spring 和bean的基础。

优点:

使得系统框架具有高度的灵活性和扩展性。(反射是框架设计的灵魂)

缺点:

1)可能引入性能问题
2)使得程序的逻辑不再直观
3)可移植性,因为反射依赖于java本身框架支持,如果移植到类似andriod平台可能就支持的不好。
4)多线程高并发环境下可能引入问题。
所以,任何语言特性都不能滥用,要考虑是否需要另一种更合适的语言。

很多设计模式使用java的反射机制实现非常方便,甚至连客户端的代码都不需要修改。例如下面的简单工厂的实现,不需要停运行环境,只需要改配置文件即可实现不同类的生产。

import java.io.*;
import java.lang.reflect.InvocationTargetException;

class Animal {
    void MyPrint(String str) {
        System.out.println(str);
    }

    void Show() {
        MyPrint("I'm Animal");
    }
}

class Dog extends Animal {
    @Override
    void Show() {
        MyPrint("I'm Dog");
    }
}

class Cat extends Animal {
    @Override
    void Show() {
        MyPrint("I'm Cat");
    }
}

class AnimalFactory {
    private static AnimalFactory factory = new AnimalFactory();
    private AnimalFactory() {}

    static AnimalFactory GetInst() {
        return factory;
    }

    Animal Create() {
        try {
            // 替换成你自己的文件路径
            File file = new File("C:\\Users\\Administrator\\IdeaProjects\\demo2\\src\\test.txt");
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String animalName = reader.readLine();
            Class<?> clazz = Class.forName(animalName);
            Object obj = clazz.getDeclaredConstructors()[0].newInstance();
            reader.close();
            return (Animal) obj;
            // 忽略异常处理
        } catch (IOException e) {

        } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {

        } catch (ClassNotFoundException e) {

        }
        return null;
    }
}

你可以在执行过程中修改test.txt文件,可以看到工厂创建的类在及时地变化,而不需要重新编译代码,甚至不需要重新启动程序。

I'm Cat
I'm Cat
I'm Cat
I'm Dog

重要的是要意识到反射没有什么魔力。当你使用反射与未知类型的对象交互时,JVM 将查看该对象,并看到它属于特定的类(就像普通的 RTTI)。在对其执行任何操作之前,必须加载 Class 对象。因此,该特定类型的 .class 文件必须在本地计算机上或通过网络对 JVM 仍然可用。因此,RTTI 和反射的真正区别在于,使用 RTTI 时,编译器在编译时会打开并检查 .class 文件。换句话说,你可以用“正常”的方式调用一个对象的所有方法。通过反射,.class 文件在编译时不可用;它由运行时环境打开并检查。

反射机制的应用场景:序列化,文档提取(见类方法提取器)。

示例代码仓库:

相关文章

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • Chapter 13 . 反射机制

    阅读原文 Chapter 13 . 反射机制 13.1 Java反射机制研究及应用 Java Reflection...

  • 详解Java反射机制(Reflection)

    详解Java反射机制(Reflection) 反射机制的作用 JAVA反射机制是在运行状态中,对于任意一个类,都能...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

网友评论

      本文标题:java反射机制

      本文链接:https://www.haomeiwen.com/subject/epkrvktx.html