当前位置:首页 > Java

java反射如何实现

2026-03-21 00:37:43Java

实现 Java 反射的基本方法

Java 反射机制允许在运行时动态获取类的信息并操作类或对象的属性、方法等。以下是实现反射的核心步骤:

获取 Class 对象

java反射如何实现

  • 通过类名获取:Class.forName("全限定类名")
    示例:Class<?> clazz = Class.forName("java.lang.String");
  • 通过对象获取:对象.getClass()
    示例:String str = ""; Class<?> clazz = str.getClass();
  • 通过类字面常量获取:类名.class
    示例:Class<?> clazz = String.class;

实例化对象

  • 通过 Class.newInstance()(已废弃,Java 9+推荐使用构造器):
    Object obj = clazz.getDeclaredConstructor().newInstance();
  • 调用带参数的构造器:
    Constructor<?> constructor = clazz.getConstructor(String.class);
    Object obj = constructor.newInstance("test");

操作字段和方法

访问字段

java反射如何实现

  • 获取字段并修改值:
    Field field = clazz.getDeclaredField("fieldName");
    field.setAccessible(true); // 突破私有限制
    field.set(obj, "newValue");

调用方法

  • 调用公共方法:
    Method method = clazz.getMethod("methodName", String.class);
    method.invoke(obj, "arg");
  • 调用私有方法:
    Method privateMethod = clazz.getDeclaredMethod("privateMethod");
    privateMethod.setAccessible(true);
    privateMethod.invoke(obj);

动态代理示例

反射常用于实现动态代理:

interface Service { void serve(); }
class RealService implements Service {
    public void serve() { System.out.println("实际服务"); }
}

InvocationHandler handler = (proxy, method, args) -> {
    System.out.println("代理前操作");
    Object result = method.invoke(new RealService(), args);
    System.out.println("代理后操作");
    return result;
};

Service proxy = (Service) Proxy.newProxyInstance(
    Service.class.getClassLoader(),
    new Class[]{Service.class},
    handler
);
proxy.serve();

注意事项

  • 反射会绕过访问权限检查,可能破坏封装性。
  • 反射操作比直接调用性能更低,频繁调用时应考虑缓存 ClassMethod 对象。
  • Java 模块化系统(Java 9+)中需在模块描述文件(module-info.java)中明确开放反射权限:
    opens package.to.open;

分享给朋友:

相关文章

h5如何实现定位

h5如何实现定位

使用HTML5 Geolocation API HTML5提供了Geolocation API,可以获取用户的地理位置信息。通过navigator.geolocation对象实现,支持获取经纬度、海拔…

vue如何实现原理

vue如何实现原理

Vue 实现原理的核心机制 Vue.js 的核心实现原理基于响应式系统、虚拟 DOM 和组件化设计。以下是关键机制的详细解析: 响应式系统 Vue 通过 Object.defineProperty(…

java如何实现多态

java如何实现多态

多态的概念 多态是面向对象编程的三大特性之一(封装、继承、多态),指同一操作作用于不同对象时,可以产生不同的行为。Java中主要通过方法重写(Override)和接口/抽象类实现多态。 实现…

vue如何实现级联

vue如何实现级联

实现级联选择器的基本方法 在Vue中实现级联选择器通常使用现成的组件库或自定义组件。以下是两种常见方式: 使用Element UI的Cascader组件 安装Element UI后,直接使用el-c…

Java如何实现异步处理

Java如何实现异步处理

Java实现异步处理的常见方法 使用CompletableFuture CompletableFuture是Java 8引入的异步编程工具,支持链式调用和组合操作。 CompletableFutur…

java如何实现单点登录

java如何实现单点登录

单点登录(SSO)的基本概念 单点登录是一种用户认证机制,允许用户通过一次登录访问多个相互信任的应用系统。核心原理是通过共享认证状态(如Token或Cookie)实现跨系统身份验证。 基于Token…