序
欢迎来到全网最完整的Java入门系列教程!!! 本教程将包含基础知识、进阶知识、常用框架等,循序渐进地分享Java中必须掌握的知识和技术。跟着老K的教程每天学习一点,你会发现入门Java没有想象中那么难。
本期我们要分享的是java反射机制相关的知识。
如果你正在学习Java,不妨收藏这篇文章,或者关注我,定期收获与Java有关的知识和项目信息!
Java进阶知识前十三课的内容,可拉到文章末尾获取。
一、介绍
在编写程序的时候,经常会遇到运行前无法确定某些对象的类型,这时候,我们可以通过Java的反射机制,有效的解决这一难题。
Java反射是一种动态生成类和对象的机制。
编写代码时,我们可能并不能知道程序运行时,某些变量会传入何种类型的对象。 反射就是为了应对这种场景,在运行时,根据运行结果实时产生合适的类和对象的技术。
示例代码:
- Player.java
public class Player {
public void attack(){};
}
- Soldier.java
public class Soldier extends Player{
@Override
public void attack() {
System.out.println("战士发动了剑击。");
}
}
- Magician.java
public class Magician extends Player{
@Override
public void attack() {
System.out.println("法师发动了法术攻击。");
}
}
- Game.java
import java.util.Scanner;
public class Game {
public static void main(String[] args) {
System.out.println("请输入你的职业:");
Scanner sc = new Scanner(System.in);
String role = sc.next();
Player player = null;
try {
player = (Player) Class.forName(role).newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
player.attack();
}
}
说明:
- 上例中Player是Soldier和Magician的父类,在Game.java中会引用到。
- 将上述4个文件存放于src目录下,运行Game.java文件,在Run运行窗口中输入Soldier或Magician,看看结果有什么不一样。
- 上例中,如果后续要增加游戏职业,无序对现有代码作出任何调整,只需在运行时输入正确的职业名,即可实现版本的更新,这就是Java反射的机制。
二、核心类
Class类
反射类或接口的类,可以实例化具体的对象。
方法 | 用途 |
Class.forName() | 获取指定Class类 |
classObj.newInstance() | 调用class的构造方法创建对象 |
classObj.getConstructor() | 获取class类的构造方法 |
classObj.getMethod() | 获取class类的内部方法 |
classObj.getField() | 获取class类的成员变量 |
Constructor类
对类的构造方法的抽象
方法 | 用途 |
classObj.getConstructor() | 获取class类的构造方法 |
constructorObj.newInstance() | 通过构造方法创建对象 |
Method类
对类的内部方法的抽象
方法 | 用途 |
classObj.getMethod() | 获取class类的内部方法 |
methodObj.invoke() | 调用并执行当前方法 |
Field类
指代类中某个成员变量
方法 | 用途 |
classObj.getField() | 获取class类的成员变量 |
fieldObj.set() | 设置成员变量的值 |
fieldObj.get() | 获取成员变量的值 |
三、getDeclared方法
默认的反射机制智能获取public对象、方法和变量,如果要调用非public方法和变量,则需要实用getDeclared系列方法。
方法 | 用途 |
getDeclaredConstructor() | 获取非public修饰的构造方法 |
getDeclaredMethod() | 获取非public修饰的内部方法 |
getDeclaredField() | 获取非public修饰的成员变量 |
关于java反射机制的知识点和实例演示就到这里。建议可以收藏这篇文章,多读几遍慢慢消化。
如果你对老K分享的内容有任何疑问,欢迎随时在评论区留言或者私信我。
正在学习的小伙伴记得给老K一个赞哦,你的支持是我持续输出课程内容最大的动力!
Java进阶知识前十三课的内容,可点击下方获取:
I/O流之File类的用法和实例详解——Java进阶知识讲义系列(八)
「Java进阶」I/O操作必备知识点:关于字符流读写的实例讲解
Java多线程知识点详解,包含实例,搞懂多线程看这一篇文章就够了
结束语
我是专注于开发领域的 @老K玩代码 ,会持续生产关于如何学习编程语言的优质内容。
如果你想学习Java编程,或者想精进你的Java编程能力,可以关注我。
如果你对开发、编程有任何疑问或者有想了解的内容,而我暂时没有写到的,也欢迎随时来找我聊聊。