写点什么

3.java 零基础入门 -Java 反射机制

作者:喵手
  • 2022 年 7 月 08 日
  • 本文字数:2770 字

    阅读完需:约 9 分钟

3.java零基础入门-Java反射机制

哈喽,各位小伙伴们好,我是喵手。

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流 学 习,互相学习,才能成长的更快,对吧。

我是一名 java 开发,所以日常接触到最多的就是 java 啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!

一、概述

        论前几期啊,我们是分别讲了Object类Date类FormDate类Calendar类System类StringBuilder类,不知道大家掌握的如何,如果没有及时巩固的同学,可以看我这里,我给大家罗列了下,快速学习通道,只希望能帮助到大家更好的学习与成长,这就是我写作的初衷。

二、前言

我们都听说过 java 有个反射机制,通过反射机制我们可以更深入的控制程序的运行过程。例如,在程序进入到运行期间,由用户输入一个类名,然后我们可以动态获取到该类拥有的所有类结构、属性名和方法,甚至还可以任意调用类的任意方法。听起来是不是很牛?我也觉得比较牛,挺有意思的,所以对于不太熟悉的小伙伴而言,那就来听我一一道来。

所以此期我们就来重点学习一下 java 的反射机制。

三、本期教学目标

  • 了解什么是反射?

  • 了解反射的优缺点

  • 熟悉通过反射获取 java 对象的方法

  • java 常用的反射机制 api

  • java 通过反射执行方法

  • 反射实例演示

四、正文

本文首先介绍一下 java 中 class 类与 java 反射的基础用法,然后再结合应用具体介绍反射。

1️⃣概念

       什么是反射?在介绍反射之前,我们先来了解两个概念,编译器和运行期。

  1. 编译器:编译器是把源代码交给编译器编译成计算机可执行的字节码文件的过程。

  2. 运行期:运行期是把编译好的字节码文件交给计算机(在内存)去执行的过程,直到运行结束。

       而 java 反射,就是在程序处于运行状态中,对于任意一个类,都能够动态的获取到这个类的所有属性、方法;对于任意一个对象,都能调用它的任意方法和内部属性。这种动态获取信息以及动态调用对象方法属性的功能就被成为 java 的反射机制。总而言之,java 反射指的是程序在运行时能获取自身的所有信息,比如类名、类路径、包路径、构造方法、私有属性等等。

所以对于 java 程序,只要你给定一个类名,你就可以通过 java 反射获取到该类的所有信息。

​2️⃣功能

对于 java 反射机制而言,它主要提供了以下功能,且这些功能都位于 java.lang.reflect 包中。

如下是对于程序中,该 reflect 截图。

​如下我就给大家诺列以下:

  • 获取任意一个对象所属的类(运行期)

  • 构造任意一个类的对象(运行期)

  • 判断任意一个类所具有的成员变量和方法(运行期)

  • 调用任意一个对象的方法(运行期)

  • 生成动态代理。

       而想要知道一个类的属性和方法,你必须先获取到该类的字节码文件对象。获取类信息时,使用的就是 class 类的方法。所以你先要获取到每一个字节码文件对应的 class 类型对象。比如:

Class aClass = dog1.getClass();

3️⃣常用 Api

       利用 class 类的对象 aClass 可以获取到的该类的所有信息,比如类信息、Object 信息。如下是列举出来的是通过反射可获取到的常用信息,具体如下:

  • getPackage():获取该类的存放路径。

  • getName():获取该类的名称。

  • getSuperclass():获取该类继承的类

  • getlnterfaces():获取该类实现的所有接口

  • getMethods():获取所有权限为 public 的方法

  • getDeclaredMethods():获取当前对象的所有方法

  • getClasses():获取所有权限为 public 的内部类

  • getFields():获取所有权限为 public 的成员变量

4️⃣优缺点

       对于反射,虽然利大于弊,但是不排除任意一个东西开发出来,都没有任何缺点。比如对于 java 的反射机制。

  • 优点:能够程序运行时动态获取类的实例,大大提高了系统的灵活性和扩展性。且对于 java 先编译后运行的机制而言,更加方便灵活创建代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加的贴切面向对象。

  • 缺点:反射会消耗一定的系统资源。因此如果不需要动态的创建一个对象,那就不需要使用反射。而且通过反射手法,在调用对象方法时可以忽略权限检查就能获取到该类的私有属性私有方法,可能会导致破坏类的封装性而导致安全问题。

5️⃣实例演示

       如下我就通过列举一个类通过实例化后来通过反射机制来动态获取该对象的一些信息。

具体演示代码如下:

@Datapublic class Dog extends Animal {//子类
private String active;
@Override public void eat() { System.out.println("我是狗狗,吃骨头!"); }
//独有功能 public void lockHome() { System.out.println("我是狗狗,我会看家"); }}
复制代码

然后我再来定义一个 main 函数进行测试获取一下该对象名称:

 public static void main(String[] args) {
Animal dog = new Dog();//向上转型
Class dogClass = dog.getClass(); System.out.println("该类的名称为:"+dogClass.getName()); }
复制代码

运行截图如下:

获取该 dog 对象包名:



public static void main(String[] args) {
Animal dog = new Dog();//向上转型
Class dogClass = dog.getClass(); System.out.println("该类的包名为:"+dogClass.getPackage());}
复制代码

运行截图如下:


获取该 dog 对象的所有方法。

public static void main(String[] args) {
Animal dog = new Dog();//向上转型
Class dogClass = dog.getClass(); Method[] methods = dogClass.getDeclaredMethods(); System.out.println("该类的所有方法为:"+methods);}
复制代码

运行截图如下:

获取所有权限为 public 的内部类。

public static void main(String[] args) {
Animal dog = new Dog();//向上转型
Class dogClass = dog.getClass(); Class[] classes = dogClass.getClasses(); System.out.println("获取所有权限为public 的内部类:" + classes);}
复制代码

点击并拖拽以移动运行截图如下:


好啦,以上就是本期内容的全部教学内容啦,如果对文中的任何知识点有疑问,欢迎评论区评论留言呀,我看见都会一一解答的。

五、文末

教学是结束了,但是有些话不知我但讲不当讲,啊哈哈, 可我还是想说给你们听听。如下是我很喜 欢的一句话,我打算送给你们,希望我们都能变得更好更优秀。

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。


发布于: 刚刚阅读数: 3
用户头像

喵手

关注

还未添加个人签名 2022.07.05 加入

还未添加个人简介

评论

发布
暂无评论
3.java零基础入门-Java反射机制_Java_喵手_InfoQ写作社区