Java反射(Constructor)(二)

简介: Constructor类是Java反射中重要的类,它是对类中构造器的描述的类。类似于Method(对类中方法的描述的类),Field(对类中属性的描述的类),我们通过创建Constructor的对象实例,就可以创建源对象。

前言

image (1).png
Constructor类是Java反射中重要的类,它是对类中构造器的描述的类。类似于Method(对类中方法的描述的类),Field(对类中属性的描述的类),我们通过创建Constructor的对象实例,就可以创建源对象。

Constructor

/**
 * {@code Constructor} provides information about, and access to, a single
 * constructor for a class.
 *
 * <p>{@code Constructor} permits widening conversions to occur when matching the
 * actual parameters to newInstance() with the underlying
 * constructor's formal parameters, but throws an
 * {@code IllegalArgumentException} if a narrowing conversion would occur.
 *
 * @param <T> the class in which the constructor is declared
 *
 * @see Member
 * @see java.lang.Class
 * @see java.lang.Class#getConstructors()
 * @see java.lang.Class#getConstructor(Class[])
 * @see java.lang.Class#getDeclaredConstructors()
 *
 * @author      Kenneth Russell
 * @author      Nakul Saraiya
 */
public final class Constructor<T> extends Executable {
    //....
}

image.png

getParameterTypes

按照声明顺序返回一组Class对象,这些对象表示此Constructor对象所表示构造方法的形参类型。如果底层构造方法不带任何参数,则返回一个长度为0的数组。

@ToString
    static class User {

        private String name;

        private int age;

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

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

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

    public static void main(String[] args) throws Exception {

        User user = new User("晓断", 22);

        for (Constructor<?> constructor : user.getClass().getConstructors()) {

            // ["java.lang.String","int"]
            System.out.println(JSON.toJSONString(constructor.getParameterTypes()));
        }
    }

newInstance

  • 使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。个别参数会自动解包,以匹配基本形参,必要时,基本参数和引用参数都要进行方法调用转换。
  • 如果底层构造方法所需形参数为0,则所提供的initargs数组的长度可能为0或null。
  • 如果构造方法的声明类是非静态上下文的内部类,则构造方法的第一个参数需要是封闭实例;请参阅Java语言规范第15.9.3节。
  • 如果所需的访问检查和参数检查获得成功并且实例化继续进行,这时构造方法的声明类尚未初始化,则初始化这个类。
  • 如果构造方法正常完成,则返回新创建且已初始化的实例。
@ToString
    static class User {

        private String name;

        private int age;

        public User() {
            
        }

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

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

        public void setName(String name) {
            this.name = name;
        }
    }
无参构造
public static void main(String[] args) throws Exception {
    
        Constructor<User> constructor = User.class.getConstructor(null);

        User user = constructor.newInstance();
        // User(name=null, age=0)
        System.out.println(user1);

        user1.setAge(22);
        // User(name=null, age=22)
        System.out.println(user1);

}
有参构造
public static void main(String[] args) throws Exception {

        Constructor<User> constructor = User.class.getConstructor(String.class, int.class);

        User user = constructor.newInstance("晓断", 22);

        // User(name=晓断, age=22)
        System.out.println(user);
    }

小结

Constructor大部分场景下还是构造实例对象的,其他的方法,可参阅:[https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html](

目录
相关文章
|
2月前
|
网络协议 算法 Java
|
10天前
|
Java
【专栏】Java中的反射机制与应用实例
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
1天前
|
Java C++
Java反射的简单使用
Java反射的简单使用
12 3
|
1天前
|
SQL 存储 Java
【Java反射详解】
【Java反射详解】
6 1
|
5天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
21 2
|
9天前
|
Java 测试技术
滚雪球学Java(24):Java反射
【4月更文挑战第13天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
17 0
滚雪球学Java(24):Java反射
|
13天前
|
Java
Java 反射
Java 反射
|
13天前
|
设计模式 Java 索引
由反射引出的Java动态代理与静态代理
由反射引出的Java动态代理与静态代理
15 0
|
13天前
|
存储 Java Shell
深入剖析Java中的反射,由浅入深,层层剥离!
深入剖析Java中的反射,由浅入深,层层剥离!
14 1
|
15天前
|
Java API Spring
Java基础教程(13)-Java中的反射和动态代理
【4月更文挑战第13天】Java反射机制允许程序在运行时获取类的信息并调用其方法。Class类是基础,提供获取类属性和方法的能力。通过Class对象,可以操作实例字段和方法,如getField、getDeclaredField等。动态代理是Java提供的创建接口实例的机制,其中JDK动态代理需目标类实现接口,而Cglib则可代理未实现接口的类。动态代理涉及Proxy和InvocationHandler接口。