Java之反射类的构造函数,通过单元测试反射创建类的对象

来源:互联网 发布:rnm网络是什么意思 编辑:程序博客网 时间:2024/06/06 07:30

需要测试的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()@Testpublic 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)@Testpublic void test2() throws Exception{Class clazz = Class.forName("cn.itcast.reflect.Person");Constructor c = clazz.getConstructor(String.class);//需要指定构造函数的参数类型为String,不然的话构造函数又有int类型的name,又有Stirng类型的namePerson p = (Person)c.newInstance("x2");System.out.println(p.name);}//反射构造函数:public Person(String name,int pass)@Testpublic 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);}@Testpublic void test4() throws Exception{Class clazz = Class.forName("cn.itcast.reflect.Person");//注意测试的这个构造函数是private的//Constructor c = clazz.getConstructor(List.class);private的构造方法不能这样写,抛出NoSuchMethodExceptionConstructor c = clazz.getDeclaredConstructor(List.class);//不管你的构造函数是什么访问权限,我强制给你打开这个访问权限c.setAccessible(true);//暴力反射  注释这一行的话就不行,抛异常Person p = (Person)c.newInstance(new ArrayList());System.out.println(p.name);}//创建对象的另外一种途径 以下代码等效于test1方法@Testpublic void test5() throws Exception{Class clazz = Class.forName("cn.itcast.reflect.Person");//其实就是反射类的无参的构造函数创建对象Person p = (Person)clazz.newInstance();//Person类里面必须要有一个无参的构造函数System.out.println(p);}//面试题:私有的东西可以被外部访问吗? 先说私有的东西只能被内部访问,但是反射可以}


0 0
原创粉丝点击