Java-Java反射调用一个类,是在编译时执行还是在运行时执行?
Java反射调用一个类,是在编译时执行还是在运行时执行?求执行过程详解,以及何时适合用到反射?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
Java反射调用一个类,是在编译时执行还是在运行时执行?求执行过程详解,以及何时适合用到反射?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
一个简单的方法帮你分辨,你用反射调用一个不存在的类的方法,如果是编译器执行,肯定在编译的时候就报错路;如果是在执行期执行,那么程序在执行的时候报错。
反射是运行时动作,显然是运行时有效,编译过程是由java的javac来执行的,程序员很好能够触及。
反射中最重要的概念就是Class,每个类都有一个Class对象,如果你知道类的完全限定名,就 可以通过Class c = Class.forName(类名)来获取到这个类的Class对象,之后你就可以通过这个Class对象来获取任何你想要的东西(类中定义的字段,方法,annotation etc.)
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():该对象中声明的方法等。此外还可以创建类的对象和执行某个方法。
在服务器端程序设计中,我们往往根据客户的不同请求,来动态调用不同的处理方法。反射机制还大量用在了框架设计中,因为在设计框架时不知道以后具体使用的类名,所以使用反射达到动态加载类并调用方法的效果。