ホームページ  >  記事  >  Java  >  Java の newInstance() メソッドと new キーワードの違いの概要

Java の newInstance() メソッドと new キーワードの違いの概要

黄舟
黄舟オリジナル
2017-09-02 10:33:171487ブラウズ

この記事では、Java の newInstance() メソッドと new キーワードの違いに関する関連情報を主に紹介します。この記事を通じて、メソッドの違いと使い方をマスターしていただければ幸いです。

newInstance を参照してください。 ( Java の) メソッドと新しいキーワード

* 違いは、前者はクラス読み込みメカニズムを使用するのに対し、後者は新しいクラスを作成する方法にあります。
* では、なぜオブジェクトを作成する方法が 2 つあるのでしょうか?これは主に、ソフトウェアのスケーラビリティ、拡張性、再利用性などのソフトウェア設計のアイデアを考慮します。
* キーワード new を使用してクラスを作成すると、クラスがロードされない場合があります。ただし、 newInstance() メソッドを使用する場合、
* は次のことを確認する必要があります。 1. このクラスがロードされていること。 2. このクラスが接続されていること。
* newInstance() は実際には新しいメソッドを 2 つのステップに分解します。つまり、最初にクラス ロード メソッドを呼び出して特定のクラスをロードし、次にそれをインスタンス化します。
* この段階的なアプローチの利点は明らかです。クラスの静的読み込みメソッド forName を呼び出すときに、より高い柔軟性を得ることができます。
* は、分離 (結合の度合いを下げる) 手段を提供します。
* 最後に、最も簡単な説明を使用して、new キーワードと newInstance() メソッドの違いを区別します。
* newInstance: 弱い型。効果がない。パラメーターのないコンストラクターのみを呼び出すことができます。
* new: 強力タイプ。比較的効率的です。任意のパブリック コンストラクターを呼び出すことができます。

コードは次のとおりです:


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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。