首页 > 编程语言 >Java 反射获得构造方法

Java 反射获得构造方法

时间:2024-09-01 22:52:21浏览次数:14  
标签:反射 Java String 构造方法 Student Constructor public name

        ConstructorExercise

package ConstructorExercise20240831;

import ClassReflect20240831.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class CreateInstance {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        // 通过反射获取其构造方法,并实例化对象
        // Instance:实例
        // 方法:newInstance(),需要用Constructor对象调用

        // 获得Student的Class对象
        Class<?> studentClass = Class.forName("ClassReflect20240831.Student");
        // 获得Student的构造方法Constructor对象
        Constructor<?> constructor = studentClass.getConstructor(String.class, String.class, int.class);
        // 通过Constructor对象的newInstance方法创建对象
        Student student = (Student) constructor.newInstance("张三", "男", 18);
        // newInstance中的参数就是Constructor对应的构造方法的形参
        System.out.println(student);

        System.out.println("----------------------------------");

        // 即使通过getDeclaredConstructor方法获得了private修饰的构造方法,也不能直接使用,否则报错
        Constructor<?> constructor2 = studentClass.getDeclaredConstructor(String.class);
        // 要使用setAccessible()方法临时取消其权限,才可以正常使用,这个操作也称为“暴力反射”
        constructor2.setAccessible(true);
        Student student2 = (Student) constructor2.newInstance("李四");
        System.out.println(student2);
    }
}

        Student

package ClassReflect20240831;

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

    public Student() {}

    private Student(String name){
        this.name = name;
    }

    private Student(int age){
        this.age = age;
    }

    private Student(String name, String gender){
        this.name = name;
        this.gender = gender;
    }

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

    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                '}';
    }

    public void eat(String food) {
        System.out.println("学生" + this.name + "正在吃" + food);
    }

    private void study() {
        System.out.println("学生" + this.name + "正在学习");
    }

}

        RefletExercise2

package ConstructorExercise20240831;

import java.lang.reflect.Constructor;

public class ReflectExercise2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        // 反射获取类中的构造方法 Constructor
        // 反射都是从class字节码文件中获取的内容,所以说需要先获得Class对象,再对其进行操作
        Class<?> studentClass = Class.forName("ClassReflect20240831.Student");

        // Constructor<?>[] getConstructor() 返回一个Constructor对象数组,包含所有以public修饰的构造方法
        // Constructor<?>[] getDeclaredConstructor() 返回一个Constructor对象数组,包含所有的构造方法

        Constructor<?>[] constructors1 = studentClass.getConstructors();
        for (Constructor<?> con : constructors1) {
            // 成功得到了所有被public修饰的构造方法并遍历
            System.out.println(con);
        }

        System.out.println("---------------------------------");

        Constructor<?>[] constructors2 = studentClass.getDeclaredConstructors();
        for (Constructor<?> con : constructors2) {
            // 成功得到了Student类中所有的构造方法,包含所有权限修饰的构造方法
            System.out.println(con);
        }

        System.out.println("---------------------------------");

        // Constructor<T> getConstructor(Class<?>...parameterTypes) 获得由public修饰的指定构造(传递构造方法形参的参数类型对象)
        // Constructor<T> getConstructor(Class<?>...parameterTypes) 获得指定构造(传递构造方法形参的参数类型对象),无视权限

        Constructor<?> constructor3 = studentClass.getConstructor(String.class, String.class, int.class);
        System.out.println(constructor3);

        // 如果用getConstructor方法获取非public修饰的构造方法,则会报错:NoSuchMethodException
        /* Constructor<?> constructor4 = studentClass.getConstructor(String.class);
        System.out.println(constructor4); */

        // 如果用getDeclaredConstructor方法,则可以无视权限修饰,获取指定的构造方法
        Constructor<?> constructor4 = studentClass.getDeclaredConstructor(String.class);
        System.out.println(constructor4);
    }
}

 

 

标签:反射,Java,String,构造方法,Student,Constructor,public,name
From: https://blog.csdn.net/Aishangyuwen/article/details/141760909

相关文章

  • 【类型转换】使用c#实现简易的类型转换(Emit,Expression,反射)
    引言哈喽。大家好,好久不见,最近遇到了一个场景,就是在FrameWork的asp.netmvc中,有个系统里面使用的是EntityFramework的框架,在这个框架里,提供了一个SqlQuery的方法,这个方法很好用啊,以至于在EFCORE8里面又添加了回来,不过不知道性能怎么样,我遇到的场景是通过SqlQuery查询的......
  • Java缓存机制:Ehcache与Guava Cache的比较
    Java缓存机制:Ehcache与GuavaCache的比较大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java应用中,缓存是一种常见的用于提高性能和减少延迟的技术。Ehcache和GuavaCache是两个流行的Java缓存库。本文将对这两个库进行比较,并展示如何在Java中使用......
  • Java并发工具类:深入理解Concurrent包
    Java并发工具类:深入理解Concurrent包大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java并发编程中,java.util.concurrent包(通常称为Concurrent包)提供了广泛的并发原语和组件,以帮助开发者编写高效、可伸缩和线程安全的并发程序。本文将深入探讨Conc......
  • Java数据库事务管理:ACID属性的实现与应用
    Java数据库事务管理:ACID属性的实现与应用大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代软件开发中,数据库事务管理是确保数据一致性和完整性的关键。ACID属性是事务处理的基石,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久......
  • Java异步编程:CompletableFuture与Future的对比
    Java异步编程:CompletableFuture与Future的对比大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java中,异步编程是一种常见的编程范式,用于提高应用程序的响应性和吞吐量。Java提供了多种异步编程工具,其中Future和CompletableFuture是两个重要的接口。......
  • Java服务端监控:Prometheus与Grafana的集成
    Java服务端监控:Prometheus与Grafana的集成大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Java应用中,服务端监控是确保应用稳定性和性能的关键。Prometheus是一个开源的系统监控和警报工具,而Grafana是一个跨平台的开源分析和监控解决方案。将这......
  • Java服务端容器化:Docker与Kubernetes的应用
    Java服务端容器化:Docker与Kubernetes的应用大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!随着微服务架构和云原生技术的发展,容器化已经成为Java服务端应用部署和管理的主流方式。Docker和Kubernetes作为容器化技术的核心工具,它们为Java应用提供了灵......
  • 深入理解Java内存模型:对并发编程的影响
    深入理解Java内存模型:对并发编程的影响大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java并发编程中,内存模型是一个至关重要的概念,它定义了程序中各个变量的访问规则,以及在多线程环境下如何正确地处理这些变量。Java内存模型(JMM)是Java规范中定义的......
  • Java虚拟机(JVM)性能调优实战指南
    Java虚拟机(JVM)性能调优实战指南大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java虚拟机(JVM)作为Java程序运行的基础,其性能直接影响到Java应用的执行效率。性能调优是Java开发中的一项重要技能,它可以帮助我们提高应用的响应速度和处理能力。本文将......
  • 探索Java中的Lambda表达式:函数式编程的实践
    探索Java中的Lambda表达式:函数式编程的实践大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java8引入了Lambda表达式,这标志着Java语言正式支持了函数式编程。Lambda表达式提供了一种简洁的方式来表示只有一个方法的接口,即所谓的函数式接口。本文将深......