需要测试的Person类的源代码如下:
package cn.itcast.reflect;
import java.util.List;
public class Person {
public String name="wpc";
public Person() {
System.out.println("无参构造函数");
}
public Person(String name){
System.out.println("参数为name的构造函数");
}
public Person(String name,int pass){
System.out.println("参数为name,pass的构造函数");
}
//私有的构造函数,通过反射的setAccessible(true)设置它可以被外部访问
private Person(List list){
System.out.println("参数为list集合的构造函数");
}
}
通过反射创建对象的测试类的源代码:
package cn.itcast.reflect;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
//反射(解剖)类的构造函数,创建类的对象
public class ReflectPerson {
//反射构造函数:public Person()
@Test
public void test1() throws Exception {
//反射是做框架用的,框架的一个特点:基于配置文件
//以后只要在配置文件里面一配置,框架就出来了
//反射的第一步,把类加载到内存里面去
Class clazz = Class.forName("cn.itcast.reflect.Person");
Constructor c = clazz.getConstructor(null);//調用无参数的构造函数
Person p = (Person)c.newInstance(null);//new对象
System.out.println(p.name);
//下面的注释和反射的输出效果一样,但后面做框架时就不合适了!!!
// Person p2 = new Person();
// System.out.println(p2.name);
}
//反射构造函数:public Person(String name)
@Test
public void test2() throws Exception{
Class clazz = Class.forName("cn.itcast.reflect.Person");
Constructor c = clazz.getConstructor(String.class);//需要指定构造函数的参数类型为String,不然的话构造函数又有int类型的name,又有Stirng类型的name
Person p = (Person)c.newInstance("x2");
System.out.println(p.name);
}
//反射构造函数:public Person(String name,int pass)
@Test
public void test3() throws Exception{
Class clazz = Class.forName("cn.itcast.reflect.Person");
Constructor c = clazz.getConstructor(String.class,int.class);
//new实例对象
Person p = (Person)c.newInstance("x3",123);
System.out.println(p.name);
}
@Test
public void test4() throws Exception{
Class clazz = Class.forName("cn.itcast.reflect.Person");
//注意测试的这个构造函数是private的
//Constructor c = clazz.getConstructor(List.class);private的构造方法不能这样写,抛出NoSuchMethodException
Constructor c = clazz.getDeclaredConstructor(List.class);
//不管你的构造函数是什么访问权限,我强制给你打开这个访问权限
c.setAccessible(true);//暴力反射 注释这一行的话就不行,抛异常
Person p = (Person)c.newInstance(new ArrayList());
System.out.println(p.name);
}
//创建对象的另外一种途径 以下代码等效于test1方法
@Test
public void test5() throws Exception{
Class clazz = Class.forName("cn.itcast.reflect.Person");
//其实就是反射类的无参的构造函数创建对象
Person p = (Person)clazz.newInstance();//Person类里面必须要有一个无参的构造函数
System.out.println(p);
}
//面试题:私有的东西可以被外部访问吗? 先说私有的东西只能被内部访问,但是反射可以
}