(反射与类操作)反射调用构造方法

反射调用构造方法

在一个类之中除了有继承的关系之外最为重要的操作就是类汇总的结构处理了,而类中的结构里面首先需观察的就是构造方法的使用问题,实际上在之前通过反射实例化对象的时候就已经接触到了构造方法的问题了。

  • 实例化方法替代;clazz.getDeclaredConstructor().newInstance();

所有的类的构造方法的获取都可以通过Class类来完成,该类中定义有如下几种方法:

 

  • 获取所有的构造方法:public Constructors<?>[] getDeclaredConstructors() throws SecurityException
  • 获取指定构造方法:public Constructors<T> getDeclaredConstructor​(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
  • 获取所有公共的构造方法:public Constructors<?>[] getConstructors() throws SecurityException
  • 获取指定公共的构造方法:public Constructors<T> getConstructor​(类<?>... parameterTypes) throws NoSuchMethodException, SecurityException

范例:观察以上方法的作用

实验的person类

package reflect;

public class Person {

    public Person(){   //无参构造

        System.out.println("Person类的无参构造方法");

    }
    public Person(long lon){

        System.out.println("我是公开的long类型构造,我的值为"+lon);

    }

    protected Person(String name){

        System.out.println("名字:"+name+",是String类型的受保护构造");

    }

    private Person(int age){

        System.out.println("年龄:"+age+"我是int类型的私有构造");

    }




}

测试类

package reflect;


import java.lang.reflect.Constructor;
import java.util.Arrays;

public class Demo{

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

        Class cls =Person.class;    //获取对象


        System.out.println("------获取全部构造------");
        Constructor<?>[] constructors1 = cls.getDeclaredConstructors();
        System.out.println(Arrays.toString(constructors1));

        System.out.println("------根据参数类型获取执行构造------");
        Constructor constructor2 = cls.getDeclaredConstructor(String.class);
        System.out.println(constructor2);

        System.out.println("------获取全部公共构造方法------");
        Constructor<?>[] constructor3 = cls.getConstructors();
        System.out.println(Arrays.toString(constructor3));

        System.out.println("------获取指定参数类型的公共构造方法------");
        Constructor constructor4 = cls.getConstructor(long.class);
        System.out.println(constructor4);
    }

}

------获取全部构造------
[private reflect.Person(int), protected reflect.Person(java.lang.String), public reflect.Person(long), public reflect.Person()]
------根据参数类型获取执行构造------
protected reflect.Person(java.lang.String)
------获取全部公共构造方法------
[public reflect.Person(long), public reflect.Person()]
------获取指定参数类型的公共构造方法------
public reflect.Person(long)

此时我如果想调用Person类中的有参构造进行Person类的实例化处理,可以通姑婆Constructor类之中提供的实例化方法操作:

public T newInstance​(Object... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException

范例:通过指定构造进行实例化对象

package reflect;


import java.lang.reflect.Constructor;
import java.util.Arrays;

public class Demo{

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

        Class cls =Person.class;    //获取对象

        Constructor constructor = cls.getConstructor(long.class);   //获取公共的long类型的构造方法
        constructor.newInstance(123456);
    }

}

我是公开的long类型构造,我的值为123456

虽然程序本身允许开发者调用有参构造处理,但是如果从实际的开发来讲,所有的使用反射的类中最好提供有无参构造,因为这样的实例化可以达到统一性。

继承关系图:(IMessageService、IChannerlsSercie、AbstractBase没有写,是Person的父接口与父抽闲象类)

(反射与类操作)反射调用构造方法

上一篇:前端小知识


下一篇:Golang 反射简单简单应用--参数教研