40. 【Java】反射:窥探类的“内在”

Web渗/透/攻/击实战(1)—成功渗/透台湾某净化设备公司官网 写在前面 作为一个防御型白帽黑客​ 你一定要知道黑客的进攻套路 才能有相应的防御措施 声明:只做测试,发现对方的漏洞,并不进行破坏性操作 1、 网站分析 地址:http://www.xxx.com.tw/ 这是一家中国台湾地区的网站,看着满屏的繁体字,就不是很舒服 网站首页包括:关于我们、资料下载、联络方式等等。 这些对我们进行sql注入用处并不大 我们需要的是可以进行参数传入的页面,这样我们就可以在参数里做文章 找一下 有没有新闻列表相关的页面 页... 阅读详情

摘要: 本文深入解析Java反射机制的核心原理与实践应用,从获取Class对象到动态访问字段、方法和构造方法,全面讲解反射在运行时检查与操作类内部结构的能力。通过实际代码示例展示反射在框架开发、序列化、配置驱动等场景中的关键作用,并探讨反射的性能开销、安全限制以及与JDK 21模块化的协同注意事项,帮助开发者掌握这一Java动态编程的强大工具。

关键词: Java反射, Class对象, 动态调用, 字段访问, 方法调用


在之前的文章中,我们一直在做一件事:写代码,然后编译运行。你定义一个类,写下它的字段和方法,然后创建对象,调用方法——这一切都在“编译时”就已经确定了。

但你想过没有:有没有可能在程序运行时,去“检查”一个类的内部结构?

比如,你有一个对象,但你不知道它是什么类型的。你能在运行时问它:“你是什么类?你有什么字段?有哪些方法?我能调用你的方法吗?”

这种能力,在 Java 中叫做 反射(Reflection)。

反射就像是一台“显微镜”或“X光机”,它让你在程序运行时,能够透视任意一个类的内部结构——无论这个类是 JDK 自带的,还是你自己写的,甚至是第三方库里的。

现代 Java 的很多基础设施都建立在反射之上:

  • Spring 框架:用反射读取你写的 @Service、@Autowired 注解,动态创建和管理对象。
  • JUnit 测试框架:用反射找到所有标注了 @Test 的方法,并动态调用它们。
  • JSON 序列化库(如 Jackson、Gson):用反射读取对象的字段名和值,转换成 JSON 字符串。
  • IDE 的自动补全和智能提示:也是通过反射(或更底层的机制)来分析代码结构。

今天,我们就来学习反射这个强大的工具。虽然你可能不会每天都在代码里直接用反射(它确实有点“重量级”),但理解它,能让你更深刻地理解 Java 的动态性,也让你在阅读框架源码时不再一头雾水。


1. 什么是反射?—— 运行时的“解剖刀”

反射(Reflection) 是 Java 语言的一种能力,它允许运行中的程序检查和操作类、接口、字段、方法的内部信息,而不需要依赖编译时的类型信息。

通俗地说:反射让你在程序运行时,能够“扒开”一个对象的外壳,看看它里面到底有什么,甚至可以动态地调用它的方法、修改它的字段——即使这些字段和方法是 private 的。

打个比方:你平时开车,是通过方向盘、油门、刹车来操控汽车——这是“正常调用”。而反射就像是,你把引擎盖打开,用工具直接去拧里面的螺丝、拉动里面的线路——这是“底层操作”。正常情况下你不应该这么做,但有时候(比如修车,即框架开发)你确实需要这种能力。


2. 获取 Class 对象 —— 反射的入口

要使用反射,你首先需要获得一个类的 Class 对象。Class 对象是反射的“总入口”,它包含了类的所有元数据——类名、包名、父类、字段、方法、构造方法、注解等等。

Java 提供了三种方式获取 Class 对象:

① 通过类名 .class
Class<String> clazz1 = String.class;
Class<Student> clazz2 = Student.class;

这种方式最简单,不需要创建对象。

② 通过对象的 getClass() 方法
Student s = new Student("张三", 20, "S001");
Class<?> clazz = s.getClass();  // 运行时实际类型

这种方式适合你不知道对象具体类型的情况。

③ 通过 Class.forName(String className)
try {
    Class<?> clazz = Class.forName("java.util.ArrayList");
    Class<?> clazz2 = Class.forName("com.example.demo.Student");
} catch (ClassNotFoundException e) {
    // 类不存在时抛出
}

这种方式适合从配置文件中读取类名,动态加载。这是很多框架(如 JDBC 驱动加载)的经典用法。

注意:Class.forName() 会触发类的静态初始化(执行 static 块),而前两种方式不会。


3. 通过反射获取类的基本信息

有了 Class 对象,你可以获取类的各种元信息:

import java.lang.reflect.Modifier;

public class ReflectionDemo {
    public static void main(String[] args) {
        Class<?> clazz = Student.class;

        // 1. 类名
        System.out.println("类名:" + clazz.getName());           // 全限定名:com.example.Student
        System.out.println("简单类名:" + clazz.getSimpleName()); // Student

        // 2. 包名
        System.out.println("包名:" + clazz.getPackage().getName());

        // 3. 父类
        Class<?> superClass = clazz.getSuperclass();
        System.out.println("父类:" + (superClass != null ? superClass.getSimpleName() : "无"));

        // 4. 实现的接口
        Class<?>[] interfaces = clazz.getInterfaces();
        System.out.println("实现的接口:");
        for (Class<?> iface : interfaces) {
            System.out.println("  " + iface.getSimpleName());
        }

        // 5. 修饰符
        int modifiers = clazz.getModifiers();
        System.out.println("是否是 public:" + Modifier.isPublic(modifiers));
        System.out.println("是否是 abstract:" + Modifier.isAbstract(modifiers));
        System.out.println("是否是 final:" + Modifier.isFinal(modifiers));
    }
}

4. 通过反射访问字段

你可以通过反射获取类的所有字段(包括 private 的),并读取或修改它们的值。

4.1 获取字段
import java.lang.reflect.Field;

public class FieldReflectionDemo {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Student.class;

        // 1. 获取所有 public 字段(包括继承的)
        Field[] publicFields = clazz.getFields();

        // 2. 获取所有字段(包括 private、protected,但不包括继承的)
        Field[] allFields = clazz.getDeclaredFields();
        for (Field field : allFields) {
            System.out.println("字段名:" + field.getName());
            System.out.println("  类型:" + field.getType().getSimpleName());
            System.out.println("  修饰符:" + Modifier.toString(field.getModifiers()));
        }

        // 3. 获取特定字段(按名称)
        Field nameField = clazz.getDeclaredField("name");  // 假设 Student 有 name 字段
        System.out.println("找到字段:name,类型:" + nameField.getType().getSimpleName());
    }
}
4.2 读取和修改字段的值
public class FieldAccessDemo {
    public static void main(String[] args) throws Exception {
        // 创建对象
        Student s = new Student("张三", 20, "S001");
        Class<?> clazz = s.getClass();

        // 获取私有字段 name
        Field nameField = clazz.getDeclaredField("name");
        // 重要!访问私有字段需要设置可访问
        nameField.setAccessible(true);

        // 读取值
        String name = (String) nameField.get(s);
        System.out.println("原来姓名:" + name);

        // 修改值
        nameField.set(s, "李四");
        System.out.println("修改后姓名:" + s.getName());  // 李四

        // 获取 age 字段
        Field ageField = clazz.getDeclaredField("age");
        ageField.setAccessible(true);
        ageField.setInt(s, 25);  // 用 setInt 设置 int 类型
        System.out.println("修改后年龄:" + s.getAge());
    }
}

重要:调用 setAccessible(true) 可以绕过 private、protected 的访问限制。这是反射最强大的地方之一,也是最需要谨慎使用的功能——它破坏了封装性,可能带来安全隐患。


5. 通过反射访问方法

你可以获取类的所有方法,并动态调用它们(即使方法是 private 的)。

5.1 获取方法
import java.lang.reflect.Method;

public class MethodReflectionDemo {
    public static void main(String[] args) {
        Class<?> clazz = Student.class;

        // 1. 获取所有 public 方法(包括继承的)
        Method[] publicMethods = clazz.getMethods();

        // 2. 获取所有方法(包括 private,不包括继承的)
        Method[] allMethods = clazz.getDeclaredMethods();
        for (Method method : allMethods) {
            System.out.println("方法名:" + method.getName());
            System.out.println("  返回类型:" + method.getReturnType().getSimpleName());
            System.out.println("  参数类型:");
            for (Class<?> param : method.getParameterTypes()) {
                System.out.println("    " + param.getSimpleName());
            }
            System.out.println("  修饰符:" + Modifier.toString(method.getModifiers()));
            System.out.println("---");
        }

        // 3. 获取特定方法(需要指定方法名和参数类型)
        Method sayHello = clazz.getDeclaredMethod("sayHello");  // 无参方法
        Method setName = clazz.getDeclaredMethod("setName", String.class);  // 有参方法
    }
}
5.2 动态调用方法
public class MethodInvokeDemo {
    public static void main(String[] args) throws Exception {
        // 创建对象
        Student s = new Student("张三", 20, "S001");
        Class<?> clazz = s.getClass();

        // 1. 调用 public 方法
        Method sayHello = clazz.getDeclaredMethod("sayHello");
        sayHello.invoke(s);  // 相当于 s.sayHello()

        // 2. 调用带参数的方法
        Method setName = clazz.getDeclaredMethod("setName", String.class);
        setName.invoke(s, "王五");  // 相当于 s.setName("王五")
        System.out.println("修改后:" + s.getName());

        // 3. 调用 private 方法(需要 setAccessible)
        Method privateMethod = clazz.getDeclaredMethod("privateHelper");  // 假设有这样一个私有方法
        privateMethod.setAccessible(true);
        Object result = privateMethod.invoke(s);  // 如果有返回值
        System.out.println("私有方法返回值:" + result);

        // 4. 调用静态方法(传入 null 作为对象)
        Method staticMethod = clazz.getDeclaredMethod("staticMethod", String.class);
        staticMethod.invoke(null, "Hello");  // 相当于 ClassName.staticMethod("Hello")
    }
}

Method.invoke(Object obj, Object... args) 的第一个参数是调用方法的对象(静态方法传 null),后面的参数是方法参数。


6. 通过反射操作构造方法

你可以用反射动态创建对象,而不使用 new 关键字。

import java.lang.reflect.Constructor;

public class ConstructorReflectionDemo {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Student.class;

        // 1. 获取所有构造方法
        Constructor<?>[] constructors = clazz.getDeclaredConstructors();
        for (Constructor<?> c : constructors) {
            System.out.println("构造方法:" + c.getName());
            System.out.println("  参数类型:");
            for (Class<?> param : c.getParameterTypes()) {
                System.out.println("    " + param.getSimpleName());
            }
        }

        // 2. 获取指定构造方法
        Constructor<?> c1 = clazz.getDeclaredConstructor(String.class, int.class, String.class);
        // 如果构造方法是 private,需要 setAccessible
        // 但通常是 public 的

        // 3. 用构造方法创建对象
        Student s = (Student) c1.newInstance("张三", 20, "S001");
        System.out.println("通过反射创建的学生:" + s.getName());

        // 4. 获取无参构造方法
        Constructor<?> c2 = clazz.getDeclaredConstructor();
        Student s2 = (Student) c2.newInstance();
        System.out.println("通过无参构造创建:" + s2);
    }
}

7. 反射与泛型 —— 类型擦除后的“残余信息”

我们之前学过,Java 的泛型有类型擦除——运行时,List<String> 和 List<Integer> 在 JVM 看来都是 List。但反射可以捕获到泛型的“残余信息”,比如通过 Field.getGenericType() 获取带泛型参数的类型。

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class GenericReflectionDemo {
    private List<String> names;

    public static void main(String[] args) throws Exception {
        Field field = GenericReflectionDemo.class.getDeclaredField("names");
        
        // 普通类型
        Class<?> fieldType = field.getType();
        System.out.println("普通类型:" + fieldType.getSimpleName());  // List

        // 泛型类型(保留泛型信息)
        Type genericType = field.getGenericType();
        if (genericType instanceof ParameterizedType) {
            ParameterizedType pt = (ParameterizedType) genericType;
            System.out.println("原始类型:" + pt.getRawType().getTypeName());  // List
            for (Type arg : pt.getActualTypeArguments()) {
                System.out.println("泛型参数:" + arg.getTypeName());  // String
            }
        }
    }
}

这种能力在 JSON 解析框架(如 Jackson)中非常关键——它需要知道 List<User> 里的元素是 User 类型,才能正确反序列化。


8. 反射的性能与安全

8.1 性能开销

反射比普通调用慢,原因包括:

  • Class 对象的创建和元数据的加载
  • setAccessible 的检查
  • 方法的动态分派
  • 编译器的优化受限

在性能敏感的代码中(比如每秒调用数百万次),应避免使用反射。但在大多数业务场景(如框架初始化、配置加载)中,反射的开销可以忽略。

粗略经验:反射调用比直接调用慢 2~5 倍。但如果你只调用一次或几次,完全不用担心。

8.2 安全限制

反射可以绕过 private 修饰符,这破坏了封装性。在安全管理器(SecurityManager)启用的情况下,某些反射操作会被禁止(比如访问 private 字段)。在大多数普通 Java 应用中,安全管理器默认是关闭的。


9. 反射的典型应用场景

场景说明
框架开发Spring、JUnit、Hibernate 等通过反射读取注解、动态创建对象、注入依赖。
序列化/反序列化JSON/XML 库通过反射读取对象的字段名和值。
配置驱动的代码从配置文件读取类名,用 Class.forName() 动态加载。
调试工具IDE 的变量查看器、JVM 的 JMX 工具等通过反射读取运行时对象的内部状态。
注解处理器读取注解并进行处理(比如生成代码)。
ORM 框架将数据库表映射到 Java 对象,通过反射读取字段并赋值。

10. 综合示例 —— 一个简单的“对象转 JSON”工具

我们写一个小工具,把任意对象的字段(包括私有)转成 JSON 格式的字符串。

import java.lang.reflect.Field;
import java.util.*;

public class SimpleJsonSerializer {

    /**
     * 将对象序列化为 JSON 字符串(简化版,只处理基本类型和 String)
     */
    public static String toJson(Object obj) throws IllegalAccessException {
        if (obj == null) {
            return "null";
        }

        Class<?> clazz = obj.getClass();

        // 如果是基本类型、String、包装类,直接返回字符串表示
        if (clazz.isPrimitive() || obj instanceof String || 
            obj instanceof Number || obj instanceof Boolean) {
            return String.valueOf(obj);
        }

        // 如果是 List/Set/数组,处理成 JSON 数组
        if (obj instanceof Collection<?> collection) {
            List<String> items = new ArrayList<>();
            for (Object item : collection) {
                items.add(toJson(item));
            }
            return "[" + String.join(",", items) + "]";
        }

        // 如果是 Map,处理成 JSON 对象
        if (obj instanceof Map<?, ?> map) {
            List<String> entries = new ArrayList<>();
            for (Map.Entry<?, ?> entry : map.entrySet()) {
                String key = String.valueOf(entry.getKey());
                String value = toJson(entry.getValue());
                entries.add("\"" + key + "\":" + value);
            }
            return "{" + String.join(",", entries) + "}";
        }

        // 普通对象:处理所有字段
        Field[] fields = clazz.getDeclaredFields();
        Map<String, String> jsonMap = new LinkedHashMap<>();

        for (Field field : fields) {
            // 跳过静态字段
            if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
                continue;
            }

            field.setAccessible(true);
            Object value = field.get(obj);
            jsonMap.put(field.getName(), toJson(value));
        }

        // 构建 JSON 字符串
        List<String> pairs = new ArrayList<>();
        for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
            pairs.add("\"" + entry.getKey() + "\":" + entry.getValue());
        }
        return "{" + String.join(",", pairs) + "}";
    }

    public static void main(String[] args) throws Exception {
        // 测试用的数据类
        class Address {
            String city = "成都";
            String street = "天府大道";
        }

        class Person {
            String name = "张三";
            int age = 20;
            boolean active = true;
            Address address = new Address();
            List<String> hobbies = List.of("编程", "阅读", "跑步");
        }

        Person person = new Person();
        String json = toJson(person);
        System.out.println("JSON 输出:");
        System.out.println(json);

        // 输出(格式化后):
        // {
        //   "name":"张三",
        //   "age":20,
        //   "active":true,
        //   "address":{
        //     "city":"成都",
        //     "street":"天府大道"
        //   },
        //   "hobbies":["编程","阅读","跑步"]
        // }
    }
}

这个例子展示了反射在序列化场景中的实际应用——我们不需要为每个类单独写序列化方法,反射可以通用地处理任何对象。


11. 反射与 JDK 21 的协同

JDK 21 中,反射依然是最重要的底层机制之一。但需要注意的是,随着模块化(JPMS)的普及,反射在模块间的访问受到了一些限制:

  • 如果一个包没有被 exports 导出,外部模块的反射无法访问它。
  • 如果一个包被 opens 开放,则允许反射访问(即使没有导出)。

在 module-info.java 中声明:

module com.example.demo {
    // 导出包(正常访问)
    exports com.example.demo.api;
    
    // 开放包给反射
    opens com.example.demo.model;
}

这意味着,在模块化项目中,反射不是“无限制”的,框架开发者需要明确声明哪些包可以被反射访问。你作为应用开发者,通常不需要太担心这个问题——框架会处理好。


12. 今天的总结

今天我们学习了反射的核心内容:

  • 反射是什么:运行时检查、操作类、字段、方法的能力。
  • 获取 Class 对象:类名.class、对象.getClass()、Class.forName()。
  • 获取类信息:类名、包名、父类、接口、修饰符。
  • 操作字段:getDeclaredFields()、setAccessible(true)、get()、set()。
  • 操作方法:getDeclaredMethods()、invoke()。
  • 操作构造方法:getDeclaredConstructors()、newInstance()。
  • 反射与泛型:getGenericType() 获取泛型参数信息。
  • 性能与安全:反射有开销,可绕过 private,需谨慎使用。
  • 应用场景:框架、序列化、配置加载、调试工具。
  • JDK 21 注意点:模块化对反射有一定限制。

反射是 Java 强大动态性的体现,也是很多高级框架的基石。虽然你可能不会每天都直接用它,但了解它,会让你在遇到“运行时动态处理”的问题时,多一把有力的武器。


动手试试

  1. 写一个方法 printClassInfo(Class<?> clazz),打印类的所有信息:类名、父类、接口、所有字段(含类型和修饰符)、所有方法(含返回类型、参数和修饰符)。

  2. 用反射创建一个 ArrayList 对象,添加几个元素,然后遍历并打印这些元素(注意 ArrayList 的泛型被擦除了,但你可以通过反射调用 add 方法)。

  3. 给定一个对象,用反射遍历它的所有字段,把所有 String 类型的字段值改为 "modified"(提示:需要检查 field.getType() == String.class)。

  4. (挑战)写一个 @Log 注解(运行时保留),用反射读取标注了这个注解的方法,并在方法执行前后打印日志。你需要用反射实现一个简单的“AOP”效果。

反射的内容就讲到这里了。下一篇文章,我们将学习注解——那些给代码“贴标签”的元数据机制,它是很多框架(包括 Spring)的核心工具。

我们下一篇见。😃

📌 获取本系列示例代码请访问 GitCode。

Python 爬虫实战:美团大众点评餐厅数据爬取与分析 本文摘要:美团/大众点评餐厅数据爬虫实战指南 本文详细介绍了如何开发一个完整的餐厅数据爬虫系统,涵盖从环境配置到数据可视化的全流程。主要内容包括: 项目目标:爬取餐厅基本信息(名称、评分、价格等)及详情数据,支持市场分析和商业决策 技术方案:使用Python生态工具(Requests、Playwright、Pandas等)构建爬虫系统 核心挑战:破解大众点评的字体反爬机制和美团的API签名验证 实现细节:提供完整的代码示例,包括字体解析、签名生成、请求重试等关键功能 数据应用:支持将结果导出为CSV/Exc 阅读详情

相关推荐

win10安装openvpn客户端

进入C:\Program Files\TAP-Windows\bin目录,然后右键用管理员权限执行addtap.bat文件,此文件执行会创建一个网卡。链接:https://pan.baidu.com/s/1KAifTiP7qp1i5ZkfdnfwkA。4.2 进入安装目录的config下新建一个文件夹,将证书文件全部挪进去(不移动.ovpn文件)3.4 将拿到的ssl认证文件放入安装目录的config目录下。然后修改ovpn文件 “./”代表当前路径,第二个链接重复。3.1 一直下一步到这里打上勾。

qq_36200932的博客 3万+

java之反射字段,反射方法

反射字段: package heng.java.reflect.field; import java.lang.reflect.Field; public class ReflectFieldDemo { public static void main(String[] args) { /* * 获取类中的成员。反射字段。 */ try { g

花落留香 1280

NX/UG二次开发—CAM—设置程序修剪边界Boundary

最近做了一个设置CAM程序边界的小工具,分享一下经验(官方的代码在文章末尾处),以下均以修剪边界曲线为例。 以下为官方提供的源码: /***************************** Include Files **********************************/ #include <stdlib.h> #include <uf.h> #include <uf_obj.h> #include <uf_object_type

门前大桥下,游过一群鸭,快来看一看,原来是C++ 3732

Java利用反射如何查找使用指定注解的类详解

前言 最近有些空,想自己写个跟spring里的注解一样的注解来用,然后希望能找到使用了自己写了注解的类,下面来介绍一下实现方法 声明,下面代码是没看过spring源码写的,基本上都是网上找的博客,整理的 定义注解 Controller.java ? 1 2 3 4 5 6 @Target({ElementType.T...

seowen的开发 小本子 2104

手把手教你用RMII接口配置以太网PHY芯片(附YT8512实战代码)

本文详细介绍了如何使用RMII接口配置以太网PHY芯片,以国产YT8512为例,提供从硬件设计到软件驱动的全流程实战指南。内容包括RMII接口技术解析、YT8512硬件设计要点、驱动开发实战代码及常见问题排查,帮助开发者快速实现以太网通信功能。

mac99的博客 994

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 391

Java 什么是反射及反射的应用

一,概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 以下主要介绍通过反射获取私有的和公共的构造方法、成员变量、方法; 二,获取任意类的字节码对象的几种方式 Class类: Class 类的实例对象表示正在运行的 Java 应...

ezconn的博客 859

Cursor 详细使用

Cursor 是一款基于 VSCode 开发的 AI 驱动代码编辑器,集成 GPT-4、Claude3.5 等先进 LLM,具备代码补全、生成、解释、调试等功能,可提升开发效率和代码质量。3. 代码编辑:在编辑区编写代码,利用快捷键提升效率,如 Ctrl+Space 触发智能代码补全、Ctrl+K 润色或修改代码、Ctrl+L 智能问答与代码编辑。3. 代码解释:选中代码,按 Ctrl+L,输入如 “解释这段代码的功能”,Cursor 会给出详细解释。

坚持写博客,大家的关注是我前进的动力! 4811

java反射的作用及使用详解

一、反射类的概念及作用 1.什么是反射类 动态获取类或者对象的信息(属性和方法),以及动态操作对象的属性和方法的类,动态分析和使用类的信息的类 注:动态是指在java运行状态 2.反射类的作用 动态获取:动态获取类或对象的属性和方法 动态调用:动态调用对象的属性和方法 3.反射的使用场景 操作因访问权限限制的属性和方法; 实现自定义注解; 动态加载第三方jar包 按需加载类,节省编译和初始化时间; 二、反射技术的使用 1.反射主要涉及的类 反射技术的核心技术是Class对象,每个类在定义以后都有.

javase1085的博客 6464

AI 大模型接口太零散?自建私有模型管理平台统一整合,管理使用超方便!(支持飞牛nas、群晖nas等服务器快速部署)

面对多种 AI 大模型接口难统一、管理繁琐的问题🤯,本文分享一款超实用开源网关工具⚡,可聚合各大模型、自动转接口、支持可视化管理,Docker 一键部署,大幅降低开发与维护成本🚀

XiaoqiangClub的博客 266

【Codecs系列】HEVC-SCC(一):核心技术介绍

DATE: 2020.6.4【Tags: HEVC SCC】 1、参考网址 2、SCC简介 3、HEVC-SCC核心技术

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 4803

40-Java反射综合练习

② Constructor: 构造方法 Parameter: 参数。③ Field: 成员变量 Modifiers: 修饰符。④ Method: 方法 Declared: 私有的。对于任意一个对象,都可以把对象所有的字段和值,保存到文件中去。反射可以跟配置文件结合的方式,动态的创建对象,并调用方法。① get: 获取 set: 设置。① Class.forName(“全类名”);本地文件:obj_info.txt。① 获取任意一个类中的所有信息。

yelitoudu的博客 437

C#上位机面试必问30题:机器视觉+工业通信+性能优化(含答案解析)

工业通信:围绕“稳定性”展开,重点答异常处理、断线重连、资源释放;机器视觉:围绕“精度+速度”展开,重点答预处理、ROI、参数优化;性能优化:围绕“UI不卡、内存不泄、效率不低”展开,重点答异步、限流、资源复用;面试加分项:结合实际项目案例(如“我在XX项目中用信号量解决了多设备并发卡顿问题”)。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1506

java反射 获取set方法吗_Java反射基本玩法

三个主要的反射类Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法类等元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.reflect包中定义,下面是最主要的三个反射类:Constructor:类的构造函数反射类,通过Class#getConstructors()方法可以获得类的所有构造函数反射对象数组。在JDK5.0中...

weixin_42134054的博客 1002

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【31-40期】从Java反射到SSO:深度解析面试高频问题

本文针对Java开发中31-40期面试问题,从性能优化、缓存策略、加密查询到分布式锁和并发控制,全面解析高频技术问题。通过理论结合代码实例的方式,阐述每个问题的原理、应用场景及最佳实践,帮助开发者快速掌握这些重要知识点,为高难度面试和实际开发提供强有力的参考。

qq_45832651的博客 1030

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java反射Demo练习题

java反射 练习题 package hello; import java.io.FileReader; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.uti...

萍踪缘的博客 1246

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java 反射 分析类和对象

Java 反射 分析类和对象 @author ixenos 摘要:优化程序启动策略、在运行时使用反射分析类的结构和对象 优化程序启动策略 在启动时,包含main方法的类被加载。它会加载所有它需要的类。这些被加载的类又要加载它们需要的类,以此类推,这是JVM的动态加载机制。 对于一个大型的应用程序,这将消耗很多时间,用户体验不好。此时可以通过反射来优化程序启...

ddmm2012的博客 126

Java反射

反射是Java的一个特点,也是使原本为静态语言的Java,多了那么一些灵活性,在理解各个框架源码以及组件内容的时候是一个不错的知识点,比如注解,这是一个非常常见,又很好使的玩意,之前也有简单的学习---Java 注解 基础、Java 注解 实践 从主要以下几点开始学习 Class类的使用 方法的反射 成员变量的反射 构造器的反射 Java类...

xiaoyaGrace的博客 154

利用反射对类字段的解析

为什么80%的码农都做不了架构师?>>> ...

weixin_34235135的博客 202

java 反射 注入class_Java反射机制 - Class类的使用

Class类最常用的方式就是实例化对象的操作,即可以通过一个给定的字符串(此字符串包含了完整的“包.类”的路径)来实例化一个类的对象。一、通过无参构造实例化对象要想通过Class类本身实例化其他类的对象,则可以使用newInstance()方法,但是必须要保证被实例化的类中存在一个无参构造方法,代码如下:例:通过Class类实例化对象package org.lxh.demo15.getclassd...

weixin_42359449的博客 498

java反射机制的原理

什么是java的反射:1.在运行状态中,对于任何一个类,都能够知道这个类的所有方法和属性。2.对任意一个对象都能调用它的任何方法和属性。这种动态获取信息和动态调用一个对象的方法和属性的机制就是java反射。反射的作用:java程序可以加载一个运行时才得知名称的class,通过class的全限定名,利用java反射机制就可以获取该类的全部信息,可以动态的创建对象和编译。三、反射的原理JAVA语言编译...

hust_yfang的博客 1388

java 查看类_JAVA基础知识之JVM-——通过反射查看类信息

Class实例当类被加载之后,JVM中就会生成一个Class实例,通过这个实例就可以访问JVM中的这个类。有三种方式可以获取Class对象使用Class的静态方法forName(完整包名)调用类自身的class属性调用类对象的getClass方法。 该方法继承自java.lang.Object,任何对象都有这个方法。通常情况下,推荐用第二种方式。因为第二种方式既不需要重建对象,也不需要调用方法,而...

weixin_28811757的博客 2448

java反射课程_Java反射简介

Java反射简介1.Class类1) 在面向对象的世界里,万事万物皆对象。(java语言中,静态的成员、普通数据类型除外)类是不是对象呢?类是(哪个类的对象呢?)谁的对象呢?类是对象,类是java.lang.Class类的实例对象2)这个对象到底如何表示3 )Class.forName("类的全称")不仅表示了,类的类类型,还代表了动态加载类请大家区分编译、运行编译时刻加载类是静态加载类、运行时刻...

weixin_33371495的博客 88

java反射学习_Java反射学习:深入学习Java反射机制

一、Java反射的理解(反射是研究框架的基础之一)Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。二、逐步分析1、关于Class1、Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,...

weixin_30794381的博客 149

【Java复习40】Java反射机制

主要内容: 1. 学习使用框架的基础——Java反射机制 2. 参与一下对比学习,自己做出一定的贡献 框架: 1. 表示层: 1. 接收用户的输入 2. 通过控制器,选择合适的模型 3. 通过选择,选择合适的JSP页面 2. 持久层Data Access Object: 1. 将输入保存到数据库中(Object ----- SQL) View表单: action:servlet enctype=“application/x-www-form-urlencoded” enctype=“mult

界王拳十倍 240

Java通过反射来操作类的结构信息、创建对象、访问类的成员。

Java反射的各种基本方法了解,基本使用!

404 Not Found 343
上一篇: 39. 【Java】Optional:告别 NullPointerException
下一篇: 41. 【Java】注解:给代码“贴标签”
gugucoding
博客等级 码龄140天 7粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值