java 中newInstance()方法和new关键字的区别
java中newInstance()方法和new关键字的区别
*它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。
*那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
*我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,
*就必须保证:1、这个类已经加载;2、这个类已经连接了。
*newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
*这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,
*提供给了一种降耦(降低耦合度)的手段。
*最后用最简单的描述来区分new关键字和newInstance()方法的区别:
* newInstance:弱类型。低效率。只能调用无参构造。
* new:强类型。相对高效。能调用任何public构造。
代码如下:
importjava.lang.reflect.InvocationTargetException; importjava.lang.reflect.Method; importjava.lang.reflect.Field; publicclasstestInvoke{ publicvoidwork(){ System.out.println("-----------"); } publictestInvokework(Stringa,Integerb){ System.out.println(a+b); returnthis; } publicvoidwork(Integerb,intc){ System.out.println(b+c); } publicstaticvoidmain(String[]args)throwsSecurityException,NoSuchMethodException,InstantiationException,IllegalAccessException,IllegalArgumentException,InvocationTargetException{ Class>clazz=testInvoke.class; //Class>clazz=Class.forName("invoke.testInvoke"); //testInvoketinvoke=newtestInvoke();Class>clazz=tinvoke.getClass(); System.out.println(clazz); //如果源类的方法没有参数,则要用newClass[]{} Methodmethod1=clazz.getMethod("work",newClass[]{}); Methodmethod2=clazz.getMethod("work",newClass[]{String.class,Integer.class}); Methodmethod3=clazz.getMethod("work",newClass[]{Integer.class,int.class}); ObjectinvokeTest=clazz.newInstance(); /* *Method类的invoke(Objectobj,Objectargs[])方法接收的参数必须为对象,
*如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,
*如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回
*/ //invoke方法的第一个参数是源类的实例,第二个参数是实例的值 Objectresult1=method1.invoke(invokeTest,newObject[]{}); Objectresult2=method2.invoke(invokeTest,newObject[]{"aaaa",newInteger(10)}); Objectresult3=method3.invoke(invokeTest,newObject[]{3,newInteger(4)}); System.out.println(result1); System.out.println(result2); System.out.println(result3); Method[]methods=clazz.getMethods(); for(Methodmethod:methods){ System.out.println(method.getName()); } Field[]fileds=clazz.getFields(); for(Fieldfiled:fileds){ System.out.println(filed.getName()); } } }
控制台信息:
classinvoke.testInvoke ----------- aaaa10 7 null invoke.testInvoke@de6ced null work [Ljava.lang.Class;@c17164 work [Ljava.lang.Class;@1fb8ee3 work [Ljava.lang.Class;@61de33 main [Ljava.lang.Class;@14318bb wait [Ljava.lang.Class;@ca0b6 wait [Ljava.lang.Class;@10b30a7 wait [Ljava.lang.Class;@1a758cb equals [Ljava.lang.Class;@1b67f74 toString [Ljava.lang.Class;@69b332 hashCode [Ljava.lang.Class;@173a10f getClass [Ljava.lang.Class;@530daa notify [Ljava.lang.Class;@a62fc3 notifyAll [Ljava.lang.Class;@89ae9e
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!