ホームページ Java &#&はじめる Java のリフレクション メカニズム (配列パラメーターを含む) についての深い理解

Java のリフレクション メカニズム (配列パラメーターを含む) についての深い理解

Nov 28, 2019 pm 05:35 PM
java 反射機構

Java のリフレクション メカニズム (配列パラメーターを含む) についての深い理解

Java のリフレクションは、私がずっと気に入っているものです。これにより、プログラムの柔軟性が大幅に向上し、汎用性も大幅に向上します。反省の原則については大々的に紹介するつもりはありませんが、インターネットで検索すればたくさん出てきます。 (以下の付録でのみ紹介します)

リフレクションは、動的 (または準動的) 言語とみなされている Java の重要なプロパティです。このメカニズムにより、プログラムは、実行時にリフレクション API を介して、その修飾子 (public、static など)、スーパークラス (Object など)、実装されたインターフェイス (オブジェクトなど) を含む、既知の名前を持つ任意のクラスの内部情報を取得できます。クローン可能)、フィールドとメソッドに関するすべての情報が含まれており、実行時にフィールドの内容を変更したりメソッドを呼び出したりできます。

[推奨学習: Java ビデオ チュートリアル ]

ここで、私がしたいのは、文字列に基づいてやりたいことを行う場合(対応するメソッドを動的に実行したり、対応するクラスを生成したりすることを含む)、データを送信するときに、ほとんどの場合は文字列(HTTP、ソケット)などを渡すことになるということです。これらの文字列を受信すると、これらの文字列の内容に基づいて対応する処理を実行します。これは非常に良いことです。メソッドをリモートで呼び出すことができます (クライアントは指定された文字列を送信し、サーバーはリフレクションに基づいてそれを実行します)。 )。 。 。

実際、私もそのようなプロジェクトを行ったことがあります。クライアント (Java 言語で書かれていない) はソケットを使用してサーバー (Java で書かれた) メソッドを呼び出し、パラメーターを直接渡すこともできます。これらはすべてベースです。 on Java リフレクション技術により実現。さて、残りについて話しましょう。最も基本的なものから始めましょう。以下はリフレクションの基本的な方法

/**
 * @(#)TestInt.java
 * 
 * @author soda E-mail:sujun10@21cn.com
 * @version 1.0
 * <br>Copyright (C), 2007 soda.C
 * <br>This program is protected by copyright laws.
 * <br>Date:2007.4
 */
import java.lang.reflect.Method;

public class TestInt 
{
  //测试方法
  public String test(String name,int i)
  {
    System.out.println("name:" + name);
    System.out.println(i);
    return "反射成功!";
  }

  public static void main(String[] args)
  {
    try
    {
      //获取class文件,可以Class.for("Test")获取,这样也可以根据字符串生成类啦
      Class te = TestInt.class;
      Class[] cl = new Class[2];
      //添加参数类型
      cl[0] = String.class;
      cl[1] = int.class;
      System.out.println("11111111");
      //根据public的方法,以及参数,参数是Class[]形式
      Method method = te.getMethod("test", cl);
      System.out.println("222222222222");
      //开始填充参数
      Object[] params = new Object[2];
      //params[0] = new String("soda");
      params[0] = new String("soda");
      params[1] = new Integer(23);
      System.out.println("22222222222");
      //获取该class的实例
      Object obj = te.newInstance();
      //进行方法调用
      Object result = method.invoke(obj, params);
      System.out.println("结果:" + result);
    }
    catch (Exception e)
    {
      System.out.println(e);
    }
    
  }
}
ログイン後にコピー

です。コンパイルして実行します。望ましい結果が表示されます。これらの文字を入れると想像してください。文字列は次のようになります。他の場所から渡されたデータ:)

別のメソッドには配列リフレクションがあり、調べてみたところ、わずかな違いがあることがわかりました。皆さんもよく読んでください

/**
 * @(#)Test.java
 * 
 * @author soda E-mail:sujun10@21cn.com
 * @version 1.0
 * <br>Copyright (C), 2007 soda.C
 * <br>This program is protected by copyright laws.
 * <br>Program Name:FlashSyncServer
 * <br>Date:2007.1
 */
import java.lang.reflect.Method;
//这里我就不做什么解释了,和前面的几乎一样,大家也可以自己去查查api,Class类的api
public class Test 
{
  public void test(double[] dou)
  {
    System.out.println(dou.length);
    System.out.println(dou[0]);
  }
  public static void main(String[] args) throws Exception
  {
    try
    {
      Class[] cl = new Class[1];
      cl[0] = double[].class;
      System.out.println("cl[0]:" + cl[0]);
      Object[] in = new Object[1];
      //注意这里,不是Double[],而是double[]。这里不能用对象数组
      double[] db = new double[1];
      db[0] = 100.0;
      in[0] = db;
      Class te = Test.class;
      Method method = te.getMethod("test", cl);
      Object obj = te.newInstance();
      Object objs = method.invoke(obj, in);
    }
    catch (Exception e)
    {
      System.out.println(e);
    }
    
  }
}
ログイン後にコピー

わかりました。基本はこのようなものです。プログラムがどんなに複雑であっても、基礎から発展していきます。

この記事は Java 入門 列からのものです。ぜひ学習してください。

以上がJava のリフレクション メカニズム (配列パラメーターを含む) についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Javaの平方根

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Javaの完全数

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーター

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Javaのアームストロング数

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

ジャワのウェカ

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Javaのスミス番号

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

Java Springのインタビューの質問

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8 Stream Foreachから休憩または戻ってきますか?

See all articles