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

相关推荐
汤米粥2 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
冰淇淋烤布蕾5 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺11 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE27 分钟前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)36 分钟前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
yyqzjw1 小时前
【qt】控件篇(Enable|geometry)
开发语言·qt
csdn_kike1 小时前
QT Unknown module(s) in QT 以及maintenance tool的更详细用法(qt6.6.0)
开发语言·qt