Java 拓展读物 反射机制 01 类的处理
作者:谎言诞行    发布时间:2025年02月15日

反射机制解析

Java反射机制是一种强大的工具,允许程序在运行时动态地获取类的信息,并操作类或对象的属性、方法和构造器等。反射机制的核心是JVM在运行时动态加载类或调用方法/访问属性,而不需要在编写代码时或编译期知道运行对象是谁。

反射的主要作用

(1)开发通用框架:反射最重要的用途之一是开发各种通用框架。通过反射,框架可以在运行时分析类的能力,并查看对象。

(2)动态创建对象:反射允许在运行时动态地创建对象,并调用其属性和方法。这意味着对象的类型在编译期是未知的。

(3)访问和修改私有成员:反射可以访问和修改类中的私有字段和方法,即使这些字段和方法是私有的。

(4)扩展应用程序的可控性:反射可以提高应用程序的可扩展性。例如,可以通过读取配置文件来决定需要加载哪个类。

反射的特点

(1)动态性:反射允许程序在运行期间动态地创建对象、调用方法和修改属性。

(2)类型检查问题:编译器在编译时不会检查反射调用的方法或属性是否可用。

(3)性能问题:反射的性能比直接调用方法要差,因为需要先获取方法或变量的引用,然后再进行调用或访问。

(4)安全性问题:反射破坏了封装,可以对私有成员进行访问和修改。

反射机制虽然提供了很大的灵活性,但过度使用会增加代码的复杂性和运行效率,因此应当谨慎使用

准备工作

在开始学习反射的操作之前,我们先创建一个Java类用于反射测试。如下:

package net.mickarea.reflection;

/**
 * 这是一个用于测试反射机制的测试类
 * @author Michael Pang (Dongcan Pang)
 * @version 1.0
 * @since 2025年02月14日
 */
@SuppressWarnings("unused")
public class MyTester {
	
	//定义一些属性
	
	/**
	 * 一个测试用的公有静态属性
	 */
	public static final String MY_CONST_1 = "YES";
	/**
	 * 一个测试用的私有静态属性
	 */
	private static final String MY_CONST_2 = "NO";
	/**
	 * 一个测试用的私有属性,类型为整形
	 */
	private int id ;
	/**
	 * 一个测试用的私有属性,类型为字符串
	 */
	private String name ;
	/**
	 * 一个测试用的公有属性,类型为字符串
	 */
	public String pubStr ;
	
	//定义一些构造函数
	
	public MyTester() {
	}
	public MyTester(int id, String name, String pubStr) {
		this.id = id;
		this.name = name;
		this.pubStr = pubStr;
	}
	private MyTester(int id, String name) {
		this.id = id;
		this.name = name;
		this.pubStr = "这是通过私有构造函数创建的";
	}
	
	//定义关于私有属性的 setter 和 getter 方法
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	//定义一些可用的测试方法
	
	private String sayHello() {
		return "default hello.";
	}
	private String sayHello(String name) {
		return name + " hello.";
	}
	public String sayHi() {
		return "default hi.";
	}
	public String sayHi(String name) {
		return name + " hi.";
	}
	
	//定义一些可用的静态测试方法
	
	private static int getNum() {
		return 100;
	}
	private static int getNum(int param) {
		return param * 10;
	}
	public static int getNum2() {
		return 200;
	}
	public static int getNum2(int param) {
		return param * 20;
	}
	
	//重载toString方法,用于查看对象的信息
	
	@Override
	public String toString() {
		return "MyTester [id=" + id + ", name=" + name + ", pubStr=" + pubStr + "]";
	}
	
}


准备好测试用的类之后,后续篇章我们将讲解如何动态处理对象。

 

本节完结。

填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新