反射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 + "]";
    }
}
相关推荐
xcLeigh18 小时前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics
roman_日积跬步-终至千里18 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
秋邱18 小时前
用 Python 写出 C++ 的性能?用CANN中PyPTO 算子开发硬核上手指南
开发语言·c++·python
野犬寒鸦19 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
wenzhangli719 小时前
ooderA2UI BridgeCode 深度解析:从设计原理到 Trae Solo Skill 实践
java·开发语言·人工智能·开源
HalvmånEver19 小时前
Linux:线程互斥
java·linux·运维
rainbow688919 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法
灵感菇_19 小时前
Java 锁机制全面解析
java·开发语言
indexsunny19 小时前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
wazmlp00188736919 小时前
python第三次作业
开发语言·python