01_反射_02_反射类的构造方法

【工程截图】

【Person.java】 //将要被反射的类

package com.Higgin.reflect;
import java.util.List;

public class Person {
    private String name="NULL";
    private int age=0;
    
    public Person(){
        System.out.println("构造方法:Person()");
    }
    
    public Person(String name){
        System.out.println("构造方法:Person(String name)");
        this.name=name;
    }
    
    public Person(String name,int age){
        this.name=name;
        this.age=age;
        System.out.println("构造方法:Person(String name,int age)");
    }
    
    /**
     * 注意:是private 私有的!!!!!!!!
     */
    private Person(List list){
        System.out.println("构造方法:Person(List list)");
        System.out.println("list.get(0):"+list.get(0));
    }

    public void sayHello(){
        System.out.println(name+" say: hello world!");
        System.out.println("I'm "+age+" years old");
    }
}

【情况一】

【Demo01.java】测试反射无参构造方法Person()

/*
     * 反射Person类的 Person()构造方法,创建类的对象
     * @throws Exception
     */
    @Test
    public void test1() throws Exception{
        
        Class clazz=Class.forName("com.Higgin.reflect.Person");
        //反射构造方法:public Person()
        Constructor c=clazz.getConstructor(null); 
        
        Person p=(Person)c.newInstance(null);
        p.sayHello();
    }

【运行结果】

【情况二】

【Demo01.java】测试反射有参构造方法Person(Strng name)

/*
     * 反射构造方法:public Person(String name)
     */
    @Test
    public void test2() throws  Exception{
        Class clazz=new Person().getClass();  //注意,这里其实已经先创建了一个对象(因为new Person())
        //反射构造方法:public Person(String name)
        Constructor c=clazz.getConstructor(String.class);
        Person p=(Person) c.newInstance("Jack");
        p.sayHello();
    }

【运行结果】

【情况三】

【Demo01.java】测试Person(String name,int age)的情况

/*
     * 反射构造方法:public Person(String name,int age)
     */
    @Test
    public void test3() throws  Exception{
        Class clazz=Person.class;
        //反射构造方法:public Person(String name,int age)
        Constructor c=clazz.getConstructor(String.class,int.class);
        Person p=(Person) c.newInstance("Jack",18);
        p.sayHello();
    }

【运行结果】

 【情况三】

【Dem01.java】测试private Person(List list)的i情况,注意是私有的

/*
     * 注意是私有的
     * 反射构造方法:private Person(List list)
     */
    @Test
    public void test4() throws  Exception{
        Class clazz=Person.class;
        //反射构造方法:private Person(List list)
        Constructor c=clazz.getDeclaredConstructor(List.class);
        c.setAccessible(true);    //暴力反射,没有这句会出错的!!!!!!!!
        List list=new ArrayList();
        list.add("6666666");
        Person p=(Person) c.newInstance(list);
        p.sayHello();
    }

【运行结果】

【创建对象的另外一种写法】等同于test1()的测试方法

    /**
     * 创建对象的另外一种方式
     * @throws Exception
     */
    @Test
    public void test5() throws  Exception{
        Class clazz=Class.forName("com.Higgin.reflect.Person");
        Person p=(Person)clazz.newInstance();  //本质就是反射类的无参构造方法反射对象
        p.sayHello();
    }

【运行结果】

原文地址:https://www.cnblogs.com/HigginCui/p/5767098.html