面试 java反射机制实现原理_面试官你要这么问我Java反射原理,我就笑了

引读:上周我投递出了简历,岗位是java后端开发工程师。这周美团面试官给我进行了面试,面试过程中他问了Java的反射原理。(不得不夸一句,美团的效率真高,上午面完一面,晚上二面马上安排上了。)

无论什么Java技术岗位,Java反射原理,在面试中出现的次数很多,所以我面试之前也有所准备,于是今天结合面试问题先详细讲一讲Java反射原理。

JAVA反射机制

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

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

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

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

使用场景

IDE自动提示功能,对象(提示:属性、方法)

不知道类或者对象的具体信息,应该使用反射来实现。比如类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息。

原理

Java在编译之后会生成一个class文件,反射通过字节码文件找到其类中的方法和属性等

功能

关键类

Class对象

类型标识,JVM中为每个对象都保留其类型标识信息。

包含类的所有信息

可以通过该对象获取到构造方法,成员变量,成员方法和接口等信息

获取方法:通过字面量直接获取,例如XXX.class,不会触发类的初始化但XXX类已经被加载到方法区。

通过Object类的getClass方法,例如Object.getClass()。触发类的初始化

通过Class的静态方法,例如Class.forName()。触发类的初始化

Field

成员变量,类中的属性对象。

通过Class类的getDeclaredField()或getDeclaredFields()方法获取Field的方法主要分为两大类,即getXXX和setXXX

Method

类中的方法对象。包括了静态方法和成员方法(包括抽象方法在内)。

通过invoke()来完成方法被动态调用的目的。非静态变量,需要添加对象参数

setAccessible()方法不影响其他对象和原方法

getDeclaredMethod

可以获取指定方法名和参数的方法对象 Method。

@CallerSensitive

public Method getDeclaredMethod(String name, Class>... parameterTypes)

throws NoSuchMethodException, SecurityException {

checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);

//从返回的方法列表里找到一个匹配名称和参数的方法对象。

Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);

if (method == null) {

throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));

}

return method;

}

privateGetDeclaredMethods

从缓存或JVM中获取该Class中申明的方法列表。

searchMethods

从返回的方法列表里找到一个匹配名称和参数的方法对象。

如果找到一个匹配的Method,则重新copy一份返回,即Method.copy()方法。

ReflectionData

用来缓存从JVM中读取类的如下属性数据。

Constructor

构造函数。类的构造方法

getConstructor() :获取匹配的构造方法

步骤:先获取所有的constructors, 然后通过进行参数类型比较;

找到匹配后,通过 ReflectionFactory,copy一份constructor返回;

否则抛出 NoSuchMethodException;

父类/父接口

优点

通过反射,java可以动态的加载未知的外部配置对象,临时生成字节码进行加载使用,使代码更灵活,极大地提高应用的扩展性。

总结

咱们玩归玩,闹归闹,别拿面试开玩笑。

Java的反射特性是java的高级特性,在面试中屡屡碰到。面试官问的问题往往都是有关联性的,一旦问到了,大家一定要回答正确,不要丢三落四,回答到点上。大家面试前要把反射特性的原理、应用场景、功能和关键类(Class、Fileds、Methods、Constructor等)熟记。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 二叉堆_【数据结构】二叉堆:Java实现最大堆及堆排序

堆在逻辑上一棵完全二叉树,所以可以通过数组进行数据存储,而其余的树大多采用链式结构进行数据存储堆分类:大顶堆:大顶堆就是无论在任何一棵(子)树中,父节点都是最大的小顶堆:小顶堆就是无论在任何一棵(子)…

java int stack_java Stack的使用

堆栈是一种 “后进先出” (LIFO) 的数据结构, 只能在一端进行插入(称为 “压栈” ) 或删除 (称为“出栈”)数据的操作。所以很适合逆序操作,JAVA 中,使用 java.util.Stack 类的构造方法创建对象。Stack的基本方法1. public push (item )把项…

java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题

递归递归需要遵守的重要规则1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)2) 方法的局部变量是独立的,不会相互影响, 比如 n 变量3) 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.4) 递归 必须向退出递归…

java web 自定义异常_Java web, service 层应该通过异常(自定义Exception)来中断业务吗?...

同意!但是不是最佳实践还有待商榷,我这里给出自己一直使用的用异常控制流程的方案,分享讨论一下吧。由于JAVA只能有一个返回值,但有时候一个service方法除了返回结果外还真的需要有一些附加信息,比如用户非法操作时要中…

java 数据字典 spring_springboot+redis+切面实现数据字典功能

自定义注解:DataDict,用于bo对象类,需要翻译的属性package com.zddts.common.annotation.dict;import java.lang.annotation.*;/*** 说明:数据字典处理类* Created by luojie on 2019/05/29.*///DataDict( dict"patType"…

java支持多线程吗_Java多线程之一

进程与线程进程进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位,比如我们windows电脑上运行的一个程序就是一个进程。在传统进程中进程是资源分配和调度的一个基本单位,在后来引入线程概念后,进程就变成了资源分…

java继承与多态性_Java继承与多态浅析

一、继承1、通过extends继承的父类可以是不加abstract关键字的普通类,也可以是加了abstract关键字的抽象类。继承普通类时可以覆写父类的方法,或者创建自己独有的方法,或者这两 者都不使用。继承抽象类时,必须覆写抽象类中的…

java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...

前言为什么需要去了解AQS,AQS,AbstractQueuedSynchronizer,即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),JUC并发包的作者(Doug Lea)期望它能够成为实现大部分同步…

java resttemplate_java-通过resttemplate通过Spring Rest服务发送文...

标题可能看起来很普通,但是没有一个适合我的问题.我有一个REST服务,它接受多部分形式的常规参数和文件.我想使用resttemplate将数据和文件发送到上述rest服务.直到我发送正常的字符串数据为止,没有任何问题.一旦我添加了发送字节的代码,那么我开始收到400错误的请求错误.如果我…

java中string的方法_java中String的常用方法

package com.string;public class string1 {public static void main(String args[]){//将char[]数组转换成Stringchar[] ch{h,我,是,中,国,人};String strnew String(ch);System.out.println(str); //结果为str"我是中国人"//将字符串转换为char数组,方法一使用getC…

Java是否为回文_java语言判断一个数字是否为回文数字

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为…

java floyd_百度百科里面的floyd算法java的代码,总是无法运行。请问是代码有问题吗,如何编译啊?...

展开全部不能编译运行的说法是错误,但是结果是否正确,我就32313133353236313431303231363533e59b9ee7ad9431333335303539不知道了,我不懂这个算法public class FLOYD {int[][] length null;// 任意两点之间路径长度int[][][] path null;// …

cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?

原标题:并发环境下,先操作数据库还是先操作缓存?来源:捡田螺的小男孩前言在分布式系统中,缓存和数据库同时存在时,如果有写操作,先操作数据库还是先操作缓存呢?本文将分5种方案 展开…

contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常

原因: crontab 没有去读环境变量,需要再脚本中手动引入环境变量,可以用source 也可以用export 写死环境变量。为了定时监控Linux系统CPU、内存、负载的使用情况,写了个Shell脚本,当达到一定值得时候,发送邮…

java的mybatis批量更新_mybatis批量更新的问题

一、问题描述场景描述:有这样一个service方法,调用了两个dao中的方法。第一个方法按照传入的id批量更新用户名。第二个dao方法无数据库操作,仅仅抛出一个RuntimeException.这个service方法通过xml配置由spring事务管理的。两个DAO类中分别有S…

java 查看垃圾收集器_JVM系列:查看JVM使用的什么垃圾收集器

一、方法一打印虚拟机所有参数[rootlocalhost ~]# java -XX:PrintFlagsFinal -version | grep :uintx InitialHeapSize : 258689024 {product}uintx MaxHeapSize : 4139778048 {product}bool PrintFlagsFinal : true {product}bool UseCompressedOops : true {lp64_product}boo…

java在W n8安装_在windows中安装JDK8并配置环境变量-java环境变量设置

学习JAVA,必须得安装一下JDK(Java development kit java开发工具包),配置一下环境就可以学习JAVA了,下面是下载和安装JDK的教程:一、去oracle官网上下载jdk8的下载地址:https://www.oracle.com/technetwork/java/javas…

lisp java_从Java调用的LISP代码

长篇小说:我正在为我的函数编程类做一个项目,我想到在Lisp中为Mario AI competition.我正在研究从Java调用LISP代码的框架/库/方式,甚至更好的LISP Java互通信。我看过Jacol但它是旧的,对我来说也不是很好。到目前为止,我的最佳选择是:Jatha.它真的很整洁,虽然一些Lisp构造还没…

java将图片上传数据库_〔技巧实例〕轻松实现将上传图片到数据库

很久就想自己写一写程序了,不过由于赖就不想写我,今天刚好有空,所以写了这个小小的程序很容易一看就知道的,不多说了就此开始:我们做一个上传的。数据据库的字段就id自动编号 big 字段类型是 OLE 呵呵就简单的那个字段…

mysql带参数的sql_MySql存储过程是带参数的存储过程(动态执行SQL语句)

下文介绍的MySql存储过程是带参数的存储过程(动态执行SQL语句)&#xff0c;该MySql存储过程是根据用户输入的条件和排序方式查询用户的信息&#xff0c;排序条件可以没有调用方式&#xff1a;call GetUsersDynamic(age<30,);/********动态查询用户的信息********/CREATE PRO…