java 中newInstance()方法和new关键字的区别
程序员文章站
2024-02-24 14:06:16
java 中newinstance()方法和new关键字的区别
* 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。
* 那么为什么会有两...
java 中newinstance()方法和new关键字的区别
* 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。
* 那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
* 我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newinstance()方法的时候,
* 就必须保证:1、这个类已经加载;2、这个类已经连接了。
* newinstance()实际上是把new这个方式分解为两步,即首先调用class加载方法加载某个类,然后实例化。
* 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forname时获得更好的灵活性,
* 提供给了一种降耦(降低耦合度)的手段。
* 最后用最简单的描述来区分new关键字和newinstance()方法的区别:
* newinstance: 弱类型。低效率。只能调用无参构造。
* new: 强类型。相对高效。能调用任何public构造。
代码如下:
import java.lang.reflect.invocationtargetexception; import java.lang.reflect.method; import java.lang.reflect.field; public class testinvoke { public void work(){ system.out.println("-----------"); } public testinvoke work(string a,integer b){ system.out.println(a + b); return this; } public void work(integer b, int c ){ system.out.println(b + c); } public static void main(string[] args) throws securityexception, nosuchmethodexception, instantiationexception, illegalaccessexception, illegalargumentexception, invocationtargetexception{ class<?> clazz = testinvoke.class; //class<?> clazz = class.forname("invoke.testinvoke"); //testinvoke tinvoke = new testinvoke(); class<?> clazz = tinvoke.getclass(); system.out.println(clazz); //如果源类的方法没有参数,则要用new class[]{} method method1 = clazz.getmethod("work", new class[]{}); method method2 = clazz.getmethod("work", new class[]{string.class, integer.class}); method method3 = clazz.getmethod("work", new class[]{integer.class, int.class}); object invoketest = clazz.newinstance(); /* * method类的invoke(object obj,object args[])方法接收的参数必须为对象,<br/> * 如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,<br/> * 如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回<br/> */ //invoke方法的第一个参数是源类的实例,第二个参数是实例的值 object result1 = method1.invoke(invoketest, new object[]{}); object result2 = method2.invoke(invoketest, new object[]{"aaaa",new integer(10)}); object result3 = method3.invoke(invoketest, new object[]{3,new integer(4)}); system.out.println(result1); system.out.println(result2); system.out.println(result3); method[] methods = clazz.getmethods(); for(method method : methods){ system.out.println(method.getname()); } field[] fileds = clazz.getfields(); for(field filed: fileds){ system.out.println(filed.getname()); } } }
控制台信息:
class invoke.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
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: 选择MySQL数据库的命令以及PHP脚本下的操作方法
下一篇: java 抽象类的实例详解
推荐阅读
-
java 中newInstance()方法和new关键字的区别
-
详解JAVA中implement和extends的区别
-
java 中String和StringBuffer与StringBuilder的区别及使用方法
-
Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理
-
Java中List Set和Map之间的区别_动力节点Java学院整理
-
探索Java中的equals()和hashCode()方法_动力节点Java学院整理
-
JAVA中堆、栈,静态方法和非静态方法的速度问题
-
java中thread线程start和run的区别
-
详解Java8新特性之interface中的static方法和default方法
-
浅谈Java中BIO、NIO和AIO的区别和应用场景