面试系列(三):Java反射机制
Java的反射机制也会是面试中较常问到的点。建议可以从基本定义,语法和实际应用3方面作答。
1、基本定义
反射机制是在运行状态中,
对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2、基本语法
1)获取Class对象
一般有3种形式:
Class<?> class1 = Class.forName("全限定类名");
Class<?> class2 = new TestReflect().getClass();
Class<?> class3 = TestReflect.class;
System.out.println("类名称 " + class1.getName());//将打印出全限定类名(包名.类名)
2)实例化一个类的对象
方法一:newInstance
Class<A> class1 = Class.forName("全限定类名");
A a = class1.newInstance();
//调用a的set方法
方法二:构造函数
Constructor<A> cons[] = class1.getConstructors();//该类的全部构造函数
A a = (A) cons[0].newInstance();//无参
a = (A) cons[1].newInstance("value1", "value2");//带参
3)获取父类和接口(单继承多实现)
父类:
Class<A> clazz = Class.forName("全限定类名");
Class<?> parentClass = clazz.getSuperclass();
System.out.println("clazz的父类为:" + parentClass.getName());
接口:
Class<?> intes[] = clazz.getInterfaces();//该类所有接口
for (int i = 0; i < intes.length; i++) {
System.out.println((i + 1) + ":" + intes[i].getName());
}
4)获取一个类全部属性:
Class<A> clazz = Class.forName("全限定类名");
Field[] field = clazz.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
// 权限修饰符
int mo = field[i].getModifiers();
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = field[i].getType();
System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";");
}
5)获取一个类全部方法:
Class<A> clazz = Class.forName("全限定类名");
Method method[] = clazz.getMethods();
for (int i = 0; i < method.length; ++i) {
Class<?> returnType = method[i].getReturnType();//返回值类型
Class<?> para[] = method[i].getParameterTypes();//参数类型
String Modify = Modifier.toString(method[i].getModifiers());//修饰符
}
6)调用某个类的方法
Class<A> clazz = Class.forName("全限定类名");
Method method = clazz.getMethod("方法名", {参数类型1.class,参数类型2.class,……});
method.invoke(clazz.newInstance(), {参数值1,参数值2,……});
3、反射机制的应用举例:结合工厂模式
interface Animal {public abstract void eatFood();
}class Monkey implements Animal {@Overridepublic void eatFood() {System.out.println("monkey eat peach ...");}}class Panda implements Animal {@Overridepublic void eatFood() {System.out.println("Panda eat bamboo ...");}}class Factory {public static Animal getInstance(String ClassName) {Animal animal = null;try {animal = (Animal) Class.forName(ClassName).newInstance();} catch (Exception e) {e.printStackTrace();}return animal;}
}
我们来调用一下~
public static void main(String[] args) {Animal animal = Factory.getInstance("com.nineclient.Panda");if(animal != null) {animal.eatFood();}}
运行结果:
Panda eat bamboo ...
从以上3个点答反射机制,基本上就行了~~
面试系列(三):Java反射机制相关推荐
- 【javase-improved】第二篇:Java反射机制
文章目录 一.JAVA反射机制的概述 (1) 基于代码对于反射的理解 (1)通过反射访问类(以Person为例)内部成员 二.动态语言和静态语言的区分 三.Java 反射机制功能研究 四.Class类 ...
- 反射 字段_详解面试中常考的 Java 反射机制
反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性和方法. 反射是一项高级 ...
- Java反射机制大神必学系列之 ,高级与低级的差别在哪里?
Java反射机制大神必学系列之 ,高级与低级的差别在哪里? java学习爱好者 2019-05-20 19:08 前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来 ...
- 【面试】Java 反射机制(常见面试题)
文章目录 前言 一.反射是什么? 二.为什么要有反射 三.反射 API 3.1 获取 Class 对象的三种方式 3.2 获取成员变量 3.3 获取构造方法 3.4.获取非构造方法 四.实践 五.常见 ...
- Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...
Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn 发布于:2012-09-15 ...
- Java基础与提高干货系列——Java反射机制
前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...
- java反射机制深入详解_Java基础与提高干货系列——Java反射机制
前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...
- 秒懂系列,深入理解Java反射机制
文章目录 深入理解Java反射机制 一.Java反射概述 二.Java创建对象思想传递 三.类对象 3.1 类对象和类的对象 3.2 三种获取类对象的方法 四.Class对象的常用方法 4.1 获取成 ...
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control)可翻译为"控制反转",但大多数人都习惯将它称为"依赖注入".在Spring中,通过IOC可以将实现类.参数信息等配 ...
- java中h5是什么_[ 面试系列 ] - 三:H5 是什么?
系列文章 H5 和 HTML5 我想可能很多同学都和曾经的我一样,认为 H5 是 HTML5 的简写,所谓 H5 开发,就是遵循 HTML5 标准的前端开发而已.但事实并非如此,尽管 H5 这个词最早 ...
最新文章
- Spring Boot Serverless 实战 | Serverless 应用的监控与调试
- centos7 搭建vsftpd服务并锁定用户的家目录
- python中库是什么意思_python的库是什么意思
- zookeeper在windows下设置为服务启动(不需双击zkServer.cmd)
- 如何一本正经地写出别人无法维护的代码?
- Google Maps 补丁绕过、得双倍奖金这么简单?我陷入了自我怀疑
- caffe中的layers
- 清华谭浩强编著的c语言程序设计教程,清华大学谭浩强C语言程序设计教程第3版 (9).doc...
- itext 生成pdf、pdf模板生成pdf
- b700a怎么连蓝牙_233621蓝牙21无线音箱B700A小测
- 【MATLAB】MATLAB 可视化之曲面图与网格图
- Unity3D导入图片资源
- 使用Mixamo_Converter重新定义根骨骼导入UE4
- 33-Figma-数据采集器使用方式-后裔采集器
- 仓库管理系统-新名词(经济订货批量 、订货周期、订货提前期)
- 通过Python终端输入命令对NAO机器人进行实时控制
- 使用NuGet管理C++项目的依赖库
- python关于疫情新手项目_快来看看我趁着疫情学的新技能(分享python学习途中的优质资源)...
- 【5G核心网】 Handover procedures Execution phase切换流程执行阶段
- android flv格式的视频文件,android-如何运行mkv,flv,avi格式的视频文件?