反射获取构造器API

102 阅读1分钟

image.png

image.png

package run;


import org.junit.Test;

import java.lang.reflect.Constructor;

public class FileDemo {
    
    @Test
    public void getConstructors(){
        Class c = Account.class;
        Constructor[] con = c.getConstructors();//只能获取所以权限为public的构造器
        for (Constructor constructor : con) {
            System.out.println(constructor.getName() + "->" +constructor.getParameterCount());
        }
    }
    @Test
    public void getDeclaredConstructors(){
        Class c = Account.class;
        Constructor[] con1 = c.getDeclaredConstructors();//获取所有的构造器,包括权限为private的构造器
        for (Constructor constructor : con1) {
            System.out.println(constructor.getName() + "->" + constructor.getParameterCount());
        }
    }
    @Test
    public void getConstructor() throws Exception {
        Class c = Account.class;
        Constructor constructor = c.getConstructor(String.class,int.class);//根据参数获取构造器,只能获取权限为public
        System.out.println(constructor.getName() + "->" +constructor.getParameterCount());

    }
    @Test
    public void getDeclaredConstructor() throws Exception {
        Class c = Account.class;
        Constructor constructor1 = c.getDeclaredConstructor();//根据参数获取构造器,包括权限为private的构造器
        System.out.println(constructor1.getName() + "->" +constructor1.getParameterCount());
    }
    @Test
    public void newInstanceAndSetAccessible() throws Exception {
        Class c = Account.class;
        Constructor constructor = c.getConstructor(String.class,int.class);//根据参数获取构造器,只能获取权限为public
        System.out.println(constructor.getName() + "->" +constructor.getParameterCount());
        Constructor constructor1 = c.getDeclaredConstructor();//根据参数获取构造器,包括权限为private的构造器
        System.out.println(constructor1.getName() + "->" +constructor1.getParameterCount());
        
        
        Account acc = (Account) constructor.newInstance("孙悟空",100000);//根据指定的构造器创建对象
        //如果想用private修饰的构造器的换话,需要对其进行暴力反射
        constructor1.setAccessible(true);//打开权限 只是暂时打开,并不是永久打开
       Account account = (Account) constructor1.newInstance();//根据指定的构造器创建对象
    }
}

推荐使用

getDeclaredConstructors()

getDeclaredConstructor()