当前位置: 首页 > article >正文

介绍Java中的反射并举例至少5个反射中常用的API-----Java基础相关面试题分享

反射介绍

        反射(Reflection)是编程语言中的一种特性,它允许程序在运行时检查和操作自身的结构和行为。反射在许多高级编程任务中非常有用,如依赖注入、序列化、动态代理等。以下是 Java 中反射 API 的一些常用方法及其示例。


Java 反射 API 常用方法

  1. Class.forName(String className)

    • 通过类的全限定名(包名+类名)获取 Class 对象。
    • 示例:
      1try {
      2    Class<?> clazz = Class.forName("java.util.ArrayList");
      3    System.out.println("Class name: " + clazz.getName());
      4} catch (ClassNotFoundException e) {
      5    e.printStackTrace();
      6}
  2. Class.getConstructor(Class... parameterTypes)

    • 获取指定参数类型的构造器对象。
    • 示例:
      1try {
      2    Class<?> clazz = Class.forName("java.util.ArrayList");
      3    Constructor<?> constructor = clazz.getConstructor(int.class);
      4    System.out.println("Constructor: " + constructor);
      5} catch (Exception e) {
      6    e.printStackTrace();
      7}
  3. Constructor.newInstance(Object... initargs)

    • 使用指定的构造器创建新的实例。
    • 示例:
      1try {
      2    Class<?> clazz = Class.forName("java.util.ArrayList");
      3    Constructor<?> constructor = clazz.getConstructor(int.class);
      4    Object instance = constructor.newInstance(10);
      5    System.out.println("Instance: " + instance);
      6} catch (Exception e) {
      7    e.printStackTrace();
      8}
  4. Class.getMethod(String name, Class... parameterTypes)

    • 获取指定名称和参数类型的公共方法。
    • 示例:
      1try {
      2    Class<?> clazz = Class.forName("java.lang.String");
      3    Method method = clazz.getMethod("toUpperCase");
      4    System.out.println("Method: " + method);
      5} catch (Exception e) {
      6    e.printStackTrace();
      7}
  5. Method.invoke(Object obj, Object... args)

    • 调用指定对象上的方法。
    • 示例:
      1try {
      2    Class<?> clazz = Class.forName("java.lang.String");
      3    Method method = clazz.getMethod("toUpperCase");
      4    String str = "hello";
      5    Object result = method.invoke(str);
      6    System.out.println("Result: " + result);
      7} catch (Exception e) {
      8    e.printStackTrace();
      9}
  6. Class.getDeclaredField(String name)

    • 获取指定名称的字段(包括私有字段)。
    • 示例:
      1try {
      2    Class<?> clazz = Class.forName("java.lang.String");
      3    Field field = clazz.getDeclaredField("value");
      4    System.out.println("Field: " + field);
      5} catch (Exception e) {
      6    e.printStackTrace();
      7}
  7. Field.setAccessible(boolean flag)

    • 设置字段是否可以访问(忽略访问权限)。
    • 示例:
      1try {
      2    Class<?> clazz = Class.forName("java.lang.String");
      3    Field field = clazz.getDeclaredField("value");
      4    field.setAccessible(true);
      5    String str = new String("hello");
      6    char[] value = (char[]) field.get(str);
      7    System.out.println("Value: " + new String(value));
      8} catch (Exception e) {
      9    e.printStackTrace();
      10}
  8. Field.get(Object obj)

    • 获取指定对象上字段的值。
    • 示例:
      1try {
      2    Class<?> clazz = Class.forName("java.lang.String");
      3    Field field = clazz.getDeclaredField("value");
      4    field.setAccessible(true);
      5    String str = new String("hello");
      6    char[] value = (char[]) field.get(str);
      7    System.out.println("Value: " + new String(value));
      8} catch (Exception e) {
      9    e.printStackTrace();
      10}


总结

以上是一些常用的 Java 反射 API 及其示例。反射提供了强大的功能,但使用时需要注意性能开销和安全性问题。反射通常用于框架开发、测试工具和其他需要动态访问或修改类结构的场景。


http://www.kler.cn/a/326326.html

相关文章:

  • “乐鑫组件注册表”简介
  • python语言基础-5 进阶语法-5.2 装饰器-5.2.2 简单装饰器
  • 2024 同一个网段,反弹shell四种方法【linux版本】bash、python、nc、villian反弹shell图解步骤
  • 前端开发设计模式——责任链模式
  • Spring纯注解开发
  • 【计算机网络】协议定制
  • 经典文献阅读之--WiROS(用于机器人的WiFi感知工具箱)
  • 百分点科技再获多项数据智能领域奖项
  • 骨架油封对于置放环境的要求
  • 【1分钟学会】Sass
  • SpringBoot项目请求不中断动态更新代码
  • 宝塔部署vue项目出现的各种问题
  • PostgreSQL的扩展(extensions)-常用的扩展-pgstattuple
  • Pygame中Sprite实现逃亡游戏5
  • 如何使用ssm实现基于SpringMVC网上选课系统的设计与实现
  • 基于Springboot+Vue的网上书店(含源码数据库)
  • C++-list使用学习
  • 前端工程化之vite
  • 从零开发操作系统
  • 【Unity基础】Unity中跨平台使用SQLite
  • php-cgi漏洞利用
  • php 平滑重启 kill -SIGUSR2 <PID> pgrep命令查看进程号
  • SpinalHDL之结构(八)
  • 记一次pycharm在使用git提交时需要输入ssh key的密码的问题
  • 第十一届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(大学组)
  • HTTPS协议详解:从原理到流程,全面解析安全传输的奥秘