反射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 + "]";
    }
}
相关推荐
爬山算法8 分钟前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72519 分钟前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎21 分钟前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄22 分钟前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
YUJIANYUE40 分钟前
PHP纹路验证码
开发语言·php
忆~遂愿42 分钟前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds1 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹1 小时前
【Java基础】多态 | 打卡day2
java·开发语言
孞㐑¥1 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
Re.不晚1 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言