反射3-反射获取构造方法

一、反射

1. 反射获取构造方法

在Java中,反射获取构造方法是实现动态创建对象的关键技术。它使程序能够在运行时:

  • 动态加载未知类
  • 突破私有访问限制(如私有构造方法)
  • 实现框架级解耦(如Spring的Bean创建)

为什么需要反射获取构造方法的核心原因:让程序在运行时才知道要创建什么类,而不是在编译时就确定。

java 复制代码
package com.lkbhua.MyreflectDemo2;

import java.lang.reflect.Constructor;

public class demo1 {
    public static void main(String[] args) throws Exception {
        /*
            Class类中用于获取构造方法的方法:
                Constructor<?>[] getConstructors()                                      返回所有公共构造方法对象的数组
                Constructor<?> getDeclaredConstructor(Class<?>... parameterTypes)       返回所有构造方法对象的数组
                Constructor<?> getConstructor(Class<?>... parameterTypes)               返回单个公共构造方法对象
                Constructor<?> getDeclaredConstructor(Class<?>... parameterTypes)       返回单个构造方法对象

            Constructor类中用于创建对象的方法:
                T newInstance(Object... initargs)                       根据指定的构造方法创建对象
                setAccessible(boolean flag)                             设置为true,表示取消访问检查
        */

        // 1、获取class字节码文件对象
        Class clazz = Class.forName("com.lkbhua.MyreflectDemo2.Student");

        // 2、获取所有公共的构造方法
        /*Constructor[] constructors = clazz.getConstructors();
        for (Constructor c : constructors) {
            System.out.println(c);
        }
        */


        // 3、获取所有构造方法
        /*Constructor[] constructors2 = clazz.getDeclaredConstructors();
        for (Constructor c : constructors2) {
            System.out.println(c);
        }
        */

        // 4、获取单个公共的构造方法
        /*Constructor c1 = clazz.getConstructor();
        System.out.println(c1);
        */

        // 5、获取单个构造方法
        Constructor c2 = clazz.getDeclaredConstructor(String.class, int.class);
        System.out.println(c2);

        // 获得权限修饰符
        int modifiers = c2.getModifiers();

        // 表示临时取消权限校验
        // 即: 暴力反射
        c2.setAccessible(true);
        Student s = (Student) c2.newInstance("lkbhua", 18);
    }
}
java 复制代码
package com.lkbhua.MyreflectDemo2;

public class Student {
    private String name;
    private int age;

    public Student() {}

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
}
相关推荐
nanxun88619 小时前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103511 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师1 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师1 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 天前
mac(m5)平台编译openjdk
java
唐青枫2 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马2 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261352 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261352 天前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454753 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程