小白入门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 中非常重要的一部分,好啦本文就到此为止啦,希望能够对各位小伙伴有所帮助哦。

相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔4 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨6 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区8 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai9 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说9 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json