欢迎大家来到IT世界,在知识的湖畔探索吧!
序
欢迎来到全网最完整的Java入门系列教程!!! 本教程将包含基础知识、进阶知识、常用框架等,循序渐进地分享Java中必须掌握的知识和技术。跟着老K的教程每天学习一点,你会发现入门Java没有想象中那么难。
本期我们要分享的是java反射机制相关的知识。
如果你正在学习Java,不妨收藏这篇文章,或者关注我,定期收获与Java有关的知识和项目信息!
Java进阶知识前十三课的内容,可拉到文章末尾获取。
欢迎大家来到IT世界,在知识的湖畔探索吧!
一、介绍
在编写程序的时候,经常会遇到运行前无法确定某些对象的类型,这时候,我们可以通过Java的反射机制,有效的解决这一难题。
Java反射是一种动态生成类和对象的机制。
编写代码时,我们可能并不能知道程序运行时,某些变量会传入何种类型的对象。 反射就是为了应对这种场景,在运行时,根据运行结果实时产生合适的类和对象的技术。
示例代码:
- Player.java
public class Player { public void attack(){}; }
欢迎大家来到IT世界,在知识的湖畔探索吧!
- Soldier.java
欢迎大家来到IT世界,在知识的湖畔探索吧!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
欢迎大家来到IT世界,在知识的湖畔探索吧!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进阶知识前十三课的内容,可点击下方获取:
如何优雅的处理异常–Java进阶知识讲义系列(一)
包装器类装箱与拆箱的艺术——Java进阶知识讲义系列(二)
一文讲透Java字符串——Java进阶知识讲义系列(三)
List的用法和实例详解——Java进阶知识讲义系列(四)
Set的用法和实例详解——Java进阶知识讲义系列(五)
Map的用法和实例详解——Java进阶知识讲义系列(六)
常用集合的排序方法——Java进阶知识讲义系列(七)
I/O流之File类的用法和实例详解——Java进阶知识讲义系列(八)
「Java进阶」I/O操作必备知识点:字节流读写实例讲解
「Java进阶」I/O操作必备知识点:关于字符流读写的实例讲解
I/O流实战应用精选:网络图片下载器 Java必备基本功
Java多线程知识点详解,包含实例,搞懂多线程看这一篇文章就够了
如何理解Java中的线程同步锁?了解同步和锁的本质
结束语
我是专注于开发领域的 @老K玩代码 ,会持续生产关于如何学习编程语言的优质内容。
如果你想学习Java编程,或者想精进你的Java编程能力,可以关注我。
如果你对开发、编程有任何疑问或者有想了解的内容,而我暂时没有写到的,也欢迎随时来找我聊聊。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/86785.html