反射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 + "]";
    }
}
相关推荐
wanghowie2 小时前
02.04.01 Java Stream API 进阶指南:从底层实现到性能优化
java·开发语言·性能优化
专注于大数据技术栈2 小时前
java学习--Date
java·学习
superman超哥2 小时前
仓颉元编程进阶:编译期计算能力的原理与深度实践
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·仓颉元编程·编译器计算能力
青莲8432 小时前
Java基础篇——第三部
java·前端
这周也會开心2 小时前
Map集合的比较
java·开发语言·jvm
挖矿大亨2 小时前
C++中的赋值运算符重载
开发语言·c++·算法
superman超哥2 小时前
Rust 基本数据类型:类型安全的底层探索
开发语言·rust·rust基本数据类型·rust底层探索·类型安全
Liu-Eleven2 小时前
Qt/C++开发嵌入式项目日志库选型
开发语言·c++·qt