网站建设公司海外,个人网站设计流程图,海南新闻在线新闻中心,国内网站做国外服务器一、概述 我们都听说过java有个反射机制#xff0c;通过反射机制我们可以更深入的控制程序的运行过程。例如#xff0c;在程序进入到运行期间#xff0c;由用户输入一个类名#xff0c;然后我们可以动态获取到该类拥有的所有类结构、属性名和方法#xff0c;甚至还可以任意… 一、概述 我们都听说过java有个反射机制通过反射机制我们可以更深入的控制程序的运行过程。例如在程序进入到运行期间由用户输入一个类名然后我们可以动态获取到该类拥有的所有类结构、属性名和方法甚至还可以任意调用类的任意方法。听起来是不是很牛我也觉得比较牛挺有意思的所以对于不太熟悉的小伙伴而言那就来听我一一道来。 所以此期我们就来重点学习一下java的反射机制。
二、本期教学目标
了解什么是反射了解反射的优缺点熟悉通过反射获取java对象的方法java常用的反射机制apijava通过反射执行方法反射实例演示
三、正文 本文首先介绍一下java中class类与java反射的基础用法然后再结合应用具体介绍反射。
1️⃣概念 什么是反射在介绍反射之前我们先来了解两个概念编译器和运行期。
编译器编译器是把源代码交给编译器编译成计算机可执行的字节码文件的过程。运行期运行期是把编译好的字节码文件交给计算机(在内存)去执行的过程直到运行结束。 而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️⃣实例演示 如下我就通过列举一个类通过实例化后来通过反射机制来动态获取该对象的一些信息。
具体演示代码如下
Data
public class Dog extends Animal {//子类private String active;Overridepublic 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);}
运行截图如下