Java-Java反射调用一个类,是在编译时执行还是在运行时执行?

WP主题Bug提交 WP主题Bug提交 主题:1067 回复:2226

Java-Java反射调用一个类,是在编译时执行还是在运行时执行?

虐人心 发布于 2016-11-13 字数 97 浏览 1197 回复 3

Java反射调用一个类,是在编译时执行还是在运行时执行?求执行过程详解,以及何时适合用到反射?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

偏爱自由 2017-09-13 3 楼

一个简单的方法帮你分辨,你用反射调用一个不存在的类的方法,如果是编译器执行,肯定在编译的时候就报错路;如果是在执行期执行,那么程序在执行的时候报错。

夜无邪 2017-09-10 2 楼

反射是运行时动作,显然是运行时有效,编译过程是由java的javac来执行的,程序员很好能够触及。
反射中最重要的概念就是Class,每个类都有一个Class对象,如果你知道类的完全限定名,就 可以通过Class c = Class.forName(类名)来获取到这个类的Class对象,之后你就可以通过这个Class对象来获取任何你想要的东西(类中定义的字段,方法,annotation etc.)

瑾兮 2017-06-24 1 楼

Java反射最主要的功能就是可以加载、使用在运行时才得知名字的一个类,包括获得类的内部结构(可以叫“自审”)、构造该类的一个对象等,所以肯定是在运行时执行。
在Java中,对于我们定义的每一个类,编译完后都会产生一个对应的Class对象(位于.class)文件中。当我们在程序中使用一个类时,JVM会首先检查这个类的Class对象是否已经加载,如果没有,就会根据类名找到对应的.class文件加载到内存。(这里涉及到类加载器的概念,当我们用new 创建A类的一个对象时,假如这是第一次使用A类,此时就会使用Java的类加载器加载A类。此时我们事先知道有A这个类,而且往往没有认识到底层还有一个加载过程,所以可以认为这是一种隐式的动态加载;当我们使用Class.forName()方法或ClassLoader的loadClass()方法加载类时,不需要事先知道使用什么类,该类可能是作为参数传递的。此时我们显示调用方法来加载一个类,因此属于显式的动态加载。)不管怎样,一个类只有加载到内存后,你才能得到它对应的Class对象。
比如最常使用的Class c = Class.forName(类名),用该方法就可以动态加载一个类并返回它对应的Class对象(在JDBC编程中常用来加载数据库驱动类)。有了Class对象后,我们就可以得到关于该类的各种信息,通过Class类中的方法名就可以看出来,比如getSuperClass():该类的父类名称;getDeclaredMethods():该对象中声明的方法等。此外还可以创建类的对象和执行某个方法。
在服务器端程序设计中,我们往往根据客户的不同请求,来动态调用不同的处理方法。反射机制还大量用在了框架设计中,因为在设计框架时不知道以后具体使用的类名,所以使用反射达到动态加载类并调用方法的效果。