小白入门java基础-反射详解

一:介绍

Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。

Java 可运行于多个平台,如 Windows, Mac OS 及其他多种 UNIX 版本的系统。Java语言编写的程序,在一次编译后,可以在多个系统平台上运行。

主要特性:

  • Java 语言是简单的:
  • Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。
  • Java 语言是面向对象的:
  • Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
  • Java语言是分布式的:
  • Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。
  • Java 语言是健壮的:
  • Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。
  • Java语言是安全的:
  • Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。
  • Java 语言是体系结构中立的:
  • Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。

二:反射

1、什么是反射?

反射是 java 中重要的一个只是模块,其是框架设计的灵魂,基本上所有的框架都是使用反射机制来实现的。

将类的各个组成部分封装为其他对象,这就是反射机制。

2、反射的优点

  • 可以在程序运行过程中,操作这些对象
  • 可以解耦,提高程序的可扩展性

3、获取Class对象的方式

  • Class.forName("全类名"):将字节码文件加载进内存,返回 Class 对象(多用于配置文件)
  • 类名.class:通过类名的属性 class 获取(多用于传参的构造)
  • 对象.getClass():该方法定义于Object中(多用于对象的获取字节码方式)

注意:同一个字节码文件,在以上三种方式中,获取的 class 对象都是同一个。

java 复制代码
package cn.reflectTest;

public class reflectTest {
    public static void main(String[] args) throws Exception {
        // 1.通过class.forName获取
        Class cls1 = Class.forName("cn.reflectTest.reflectClass");

        // 2.直接用类名.clss获取
        Class cls2 = reflectClass.class;
        
        // 3.使用对象获取
        reflectClass obj = new reflectClass();
        Class cls3 = obj.getClass();
    }
}

4、Class 对象功能:

  1. 获取成员变量们:
    1. getFields():获取所有使用publi修饰的成员变量,返回 Field[]
    2. getField(String name):获取使用public修饰的指定成员变量,返回 Field
    3. getDeclaredFields():获取所有的成员变量,返回 Field[]
    4. getDeclaredField(String name):获取指定成员变量。返回 Field
  2. 获取构造方法们:
    1. getConstructors():返回 Construct<?>[]
    2. getConstruct(类<?>...parameterTypes):返回 Construct<T>
    3. getDeclaredConstructs():返回 Construct<?>[]
    4. getDeclaredConstruct(类<?>...parameterTypes):返回 Construct<T>
  3. 获取成员方法们:
    1. getMethods():获取所有使用publi修饰的成员方法,返回 Method[]
    2. getMethod(String name,类<?>...parameterTypes):获取使用public修饰的指定成员方法,返回 Method
    3. getDeclaredMethods():获取所有的成员方法,返回 Method[]
    4. getDeclaredMethod(String name,类<?>...parameterTypes):获取指定成员方法。返回 Method
  4. 获取类名:
    1. getName():返回 String

备注:暴力反射:setAccessible() 忽略访问权限符的安全检查

5、案例

要求:写一个框架,可以创建任意类的对象,并且执行其中的任意方法

1)目录如下

2)配置文件 pro.properties 中代码如下

java 复制代码
className=
methodName=

3)Person 和 Student 代码如下

java 复制代码
package cn.cats.doMain;

public class Person {
    public void eat(){
        System.out.println("eat...");
    }
}


package cn.cats.doMain;

public class Student {
    public void sleep(){
        System.out.println("sleep...");
    }
}

4)框架类 ReflectTest 代码如下

java 复制代码
package cn.cats.doMain;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 框架类
 */
public class ReflectTest {
    public static void main(String[] args) throws Exception {
        // 创建任意类对象,执行任意方法

        // 1.加载配置文件
        // 1.1创建pro对象
        Properties pro = new Properties();
        // 1.2加载配置文件,转换为一个集合
        // 1.2.1获取class目录下的配置文件
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        System.out.println(classLoader);
        pro.load(is);

        // 2.获取配置文件中定义的数据
        String className = pro.getProperty("c1assName");
        String methodName = pro.getProperty ( "methodName" );

        // 3.加载该类进内存
        Class cls = Class.forName(className) ;
        //4.创建对象
        Object obj = cls.newInstance();
        //5.获取方法对象
        Method method = cls.getMethod (methodName) ;
        //6.执行方法
        method.invoke(obj);

    }
}

三:结尾

通过反射的学习,虽然在实际开发中使用较少,但是当需要自己写一些框架的时候,这是必须要用到的知识。因此反射是 java 中非常重要的一部分,好啦本文就到此为止啦,希望能够对各位小伙伴有所帮助哦。

相关推荐
笃励10 分钟前
Java面试题二
java·开发语言·python
jyan_敬言19 分钟前
【Linux】Linux命令与操作详解(一)文件管理(文件命令)、用户与用户组管理(创建、删除用户/组)
linux·运维·服务器·c语言·开发语言·汇编·c++
FL162386312922 分钟前
[C#]C# winform部署yolov11-pose姿态估计onnx模型
开发语言·yolo·c#
易雪寒28 分钟前
IDEA在git提交时添加忽略文件
java·git·intellij-idea
笑非不退33 分钟前
C++ 异步编程 并发编程技术
开发语言·c++
打码人的日常分享1 小时前
企业人力资源管理,人事档案管理,绩效考核,五险一金,招聘培训,薪酬管理一体化管理系统(源码)
java·数据库·python·需求分析·规格说明书
27669582921 小时前
京东e卡滑块 分析
java·javascript·python·node.js·go·滑块·京东
爱写代码的刚子1 小时前
C++知识总结
java·开发语言·c++
martian6651 小时前
QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
开发语言·qt
冷琴19961 小时前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot