java 中newInstance()方法和new关键字的区别
* 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。
* 那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
* 我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,
* 就必须保证:1、这个类已经加载;2、这个类已经连接了。
* newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
* 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,
* 提供给了一种降耦(降低耦合度)的手段。
* 最后用最简单的描述来区分new关键字和newInstance()方法的区别:
* newInstance: 弱类型。低效率。只能调用无参构造。
* new: 强类型。相对高效。能调用任何public构造。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
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()); } } } |
控制台信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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 |
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://yangactive.iteye.com/blog/1851502