为了做到使得程序具有更高的灵活性,可配置性,在开发中我们经常利用反射来创建一个类的实例,也就是获得一个类的一个对象!通常的做法是通过class.newInstance获得;但这种方法有一个不好的地方,那就是他只能创建无参构造器的对象,如果构造器有参数那它是无能为力的;解决的方法就是 先通过该类的Class获得带有参数的构造器,然后通过得到的构造器和传如的初始化参数来创建实例!以下是上述做法的一个demo:
实体类:
- packagereflect;
- publicclassDuck{
- privateIntegerweight;
- privateStringname;
- publicDuck(){
- System.out.println("无参调用了");
- }
- publicDuck(Stringname){
- name=name;
- System.out.println("one参调用了");
- }
- publicDuck(Stringname,Integerweight){
- name=name;
- weight=weight;
- System.out.println("Two参调用了");
- }
- }
- packagereflect;
- importjava.lang.reflect.Constructor;
- importjava.lang.reflect.InvocationTargetException;
- publicclassExeTest{
- publicstaticvoidmain(String[]args){
- <SPANstyle="COLOR:#000000">Classcls=Duck.class;</SPAN>
- Classconargs[]={String.class,Integer.class};
- try{
- <SPANstyle="COLOR:#000000">Constructorconstructor=cls.getConstructor(conargs);</SPAN>
- Stringname="abc";
- Integerweight=newInteger(1056);
- Objectinitargs[]={name,weight};
- <SPANstyle="COLOR:#000000">constructor.newInstance(initargs);</SPAN>
- }catch(SecurityExceptione){
- e.printStackTrace();
- }catch(NoSuchMethodExceptione){
- e.printStackTrace();
- }catch(IllegalArgumentExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }catch(InstantiationExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }catch(IllegalAccessExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }catch(InvocationTargetExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- }