一、Java反射的核心

Java反射是Java中一个很牛的动态功能,能让程序在运行时了解类的信息,比如字段、方法等,还能改变类或对象的属性。通过反射,开发者能实现不硬编码就加载类、创建对象、调用方法等。这种机动性让反射成很多框架如Spring、Hibernate,及高级应用像动态代理、插件系统的关键技术。

Java反射机制:它的原理,和用法,以及好的实践


关键词:Java反射,动态编程,类加载,Spring


二,JAVA反射基本机制

Java反射是用 JVM 的类加载和运行信息做的。类被JVM加载,会给它弄个唯一的Class对象。这个对象存了类的所有信息,像字段、方法啥的。


反射的核心流程:


得到Class对象:可用类名、对象或Class.forName()拿类的信息。

分析类结构,用Class对象拿字段、方法、构造器信息。

操作对象:调用方法、访问值,还能改私有成员,要设置setAccessible(true)。

三。Java 反射的主要类及接口

Java 反射 API 在 java.lang.reflect 包;主要类有:


Class<T>:表示类的信息,反射的起点。

Field:就是类中的那个,嗯,成员变量。

Method:就是类里头的功能。

Constructor<T>:这就是类的创建方法。

Annotation,给类加注解用的东西。

示例代码:


Java

深色版本

// 拿到Class对象

Class<?> clazz = ClassforName("com.example.Person");


拿字段然后改数值

FieldNameField clazz.getDeclaredField("name");

nameField.setAccessible(true);  允许访问隐藏字段

nameField给personObj设置名称为Alice


// 调用方法

Java反射机制:它的原理,和用法,以及好的实践

sayHelloMethod是从clazz得到的,调用方法是sayHello,带有一个String参数

sayHelloMethod.invoke(personObj, "Hi, Reflexion!")

四 Java反射常用场合

框架开发:

Spring框架,反射加载Bean,实现DI和IoC。

Hibernate ORM,它读实体类字段,用反射来映射数据库表。

动态代理:

AOP编程,用动态代理加日志、权限等功能。

插件化系统:

运行时加载JAR包里的类,做功能增加。

测试工具:

单元测试框架像 JUnit 用反射自动找并执行测试方法。

五,Java反射好坏处分析

优点:


灵活度很高;能运行中操作类和对象,满足复杂业务。

代码复用性很高,反射能做出通用的工具,例如 JSON 序列化。

支持动态加载,不需要重启应用,马上就能加新模块。

缺点:


性能开销高:反射操作慢于直接调用,因要解析元数据。

破坏封装:能进入私有成员,或让设计抽象乱套。

可读性差:反射用多了,代码就难读懂,也难维护。

六、Java反射的使用技巧

合理使用反射:

性能敏感代码别老用反射,比如常被调用的方法。

框架开发时要先用反射,业务逻辑里最好别用。

优化反射性能:

缓存Class、Method,能减少查找时间。

用 setAccessible(true) 提升私有成员访问;但小心安全出问题。

安全控制:

在敏感环境,要限制反射访问私有成员。

Java反射机制:它的原理,和用法,以及好的实践

别用反射调用危险方法,比如 System.exit。

七,Java反射实战例子

案例:动态建对象,然后调方法


Java

深色版本

// 定义一个简单类

public class 计算器 {

    public int add(int a , int b){

        return a与b的和;

    }

}


// 反射调用示例

public class DemoReflection {

    public static void main(String args[])Exception {

        得到类 对象

        Class clazz = ClassforName("Calculator");


        // 创建对象实例

        Object calc = clazz.getConstructor().create();


        // 调用 add 方法

        Method add = clazz.getMethod("add", int, int);

        int result=addMethod.invoke(calculator,5,3)(int);


        System.out.println("加的结果:" + result); // 输出8

    }

}


《Java反射机制:它的原理,和用法,以及好的实践》.doc
将本文下载保存,方便收藏和打印
下载文档