【工程截图】
【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(); }
【运行结果】