首頁 >Java >java教程 >Java中關於newInstance()方法與new關鍵字的差異介紹

Java中關於newInstance()方法與new關鍵字的差異介紹

黄舟
黄舟原創
2017-09-02 10:33:171532瀏覽

這篇文章主要介紹了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

以上是Java中關於newInstance()方法與new關鍵字的差異介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn