反射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 + "]";
    }
}
相关推荐
cany100015 小时前
C++ -- 动态内存分配和释放(new/delete)
开发语言·c++
MaCa .BaKa15 小时前
55-宠物爱心救助领养系统-宠物救助领养系统
java·vue.js·tomcat·maven·springboot·宠物救助领养系统
brycegao32115 小时前
Vue3+Go 全栈项目上线阿里云|从 0 到 1 踩坑全纪录
开发语言·阿里云·golang
ch.ju15 小时前
Java Programming Chapter 4——cite
java·开发语言
小张小张爱学习15 小时前
Spring Boot 多线程并发入门教程:ThreadPoolTaskExecutor + CompletableFuture
java·spring boot·后端
西安邮电大学15 小时前
Redis核心数据结构以及应用场景
java·redis·后端·其他·面试
优雅格子衫15 小时前
uniapp 拍照相册选取后超级好用的裁剪组件,增加水印完全自定义
开发语言·前端·javascript·uni-app·vue
NiceCloud喜云15 小时前
Claude Code 跑 HyperFrames 实测:本地生成 AI 视频素材全流程
java·运维·人工智能·自动化·json·音视频·飞书
lili001215 小时前
Claude自动修Bug配置优化与避坑指南
java·人工智能·python·bug·ai编程
逻极15 小时前
Java 从入门到精通:核心原理、最佳实践与性能优化
java·jvm·并发编程·集合框架