---
schema_version: "1"
id: c181af913415ea7b048fbed6a5aa0f56c7a56e0826bff809f2638bc12bc517e3
title: メソッドの呼び出し
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/java-module/latest/java-invoke-method.md
canonical_url: https://docs.mulesoft.com/jp/java-module/latest/java-invoke-method
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 03c5c57f320f74b8310de1945abb0dd79baba350a718ce5d8b9e364e4480f24e
description: MuleSoft Documentation Site
release: "2.0"
latest: true
---
# メソッドの呼び出し

Java メソッド (インスタンスまたは静的) は、Java Module の ​`invoke`​ および ​`invoke static`​ 操作を使用してコールできます。それらの戻り値は、出力メッセージのペイロードに内に置かれるか、​[対象変数](https://docs.mulesoft.com/mule-runtime/latest/target-variables)​に保存できます。

Java Invoke 操作の設定可能なパラメーターの詳細な説明は、​[「Java Module リファレンス」の「操作」セクション](https://docs.mulesoft.com/jp/java-module/latest/java-reference#operations)​を参照してください。

## [](#インスタンスメソッドの呼び出し)インスタンスメソッドの呼び出し

次の Java クラス ​`TaxCalculator`​ は ​`com.me`​ パッケージに属しています。

```java
package com.me;

public class TaxCalculator {

    private Double percentBaseTax = 7.0;

    public Double calculateTax(Double price, Integer percentAdditionalTax) {
        return price * (this.percentBaseTax + percentAdditionalTax) / 100;
    }

    public Boolean isTaxFree(Double price) {
        if (price < 10) {
            return true;
        }
        return false;
    }
}
```

<table>
<tbody><tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
<div class="paragraph">
<p>Java Module で使用されるクラスがデフォルトパッケージに属していない場合、クラスをエクスポートする必要があります。それ以外の場合、実行に失敗し、JAVA:CLASS_NOT_FOUND​ エラーが表示されます。​<a href="https://docs.mulesoft.com/mule-runtime/latest/how-to-export-resources" class="xref page">「リソースのエクスポート方法」</a>​を参照してください。</p>
</div>
</td>
</tr>
</tbody></table>

インスタンスメソッドを呼び出す手順は、次のとおりです。

1. Java Module の ​[New 操作](https://docs.mulesoft.com/jp/java-module/latest/java-create-instance)​を使用して、後でメソッドを呼び出すオブジェクトを作成します。これにより、インスタンス化されたオブジェクトが提供され、そのメソッドの 1 つをコールできます。
2. `invoke`​ 操作をオブジェクトのいずれかのメソッドをコールするように設定します。​`new`​ 操作と同様、​`invoke`​ は入力パラメーターのマップを取り (メソッドに存在する場合)、​[対象パラメーター](https://docs.mulesoft.com/mule-runtime/latest/target-variables)​をサポートします。

次の例では、​`TaxCalculator`​ クラスのインスタンスが作成され、​`taxCalculator`​ 対象変数内に置かれます。次に、​`price`​ と ​`percentAdditionalTax`​ を引数として取る ​`calculateTax(Double, Integer)`​ メソッドがコールされ、その戻り値が ​`totalTax`​ 変数内に置かれます。

```xml
<java:new class="com.me.TaxCalculator"
	constructor="TaxCalculator()"
	target="taxCalculator"/>

<java:invoke instance="#[vars.taxCalculator]"
  class="com.me.TaxCalculator"
  method="calculateTax(Double, Integer)"
  target="totalTax">
      <java:args>#[{
        price: 25.5,
        percentAdditionalTax: 2
      }]</java:args>
</java:invoke>
```

メソッドのパラメーターでは、​`constructor="Person(java.lang.Double, java.lang.Integer)"`​ などの完全なパッケージ名を指定できます。これは必要ありませんが、コードをより明確にしたり、Java コードに競合するクラス名がある場合に役立ちます。

Anypoint Studio では、Java Module は ​`invoke`​ 操作で DataSense をサポートしています。DataSense は入力引数と出力値の両方のメタデータを提供します。

この例では、DataSense は ​`calculateTax`​ が ​`Number`​ を返すことを検出するため、​`invoke`​ 操作の出力メタデータは次のようになります。

![invoke output metadata](/mulesoft/current/ja-jp/java-module/latest/_images/invoke-output-metadata.png)

Studio で ​`invoke`​ を使用する完全な例については、「​[Studio での New 操作および Invoke 操作](#studio_example)​」を参照してください。

`args`​ パラメーターにコンストラクターの引数を設定する場合は、マップのキーでパラメーターがコンストラクターに渡される方法を判断します。

パラメーターを名前 (​`price`​、​`percentAdditionalTax`​ など) で参照するには、 [`-parameters`](https://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html)​ コンパイラーフラグを使用して、メソッドまたはコンストラクターを含む Java クラスをコンパイルする必要があります。 クラスがこのフラグを使用してコンパイルされていない場合は、同じパラメーターが宣言された順序と ​`arg0`​、​`arg1`​ のような正規名で参照されます。

この場合は次のようになります。

```xml
<java:args>#[{
  arg0: 25.5,
  arg1: 2
}]</java:args>
```

Java クラスが Studio プロジェクトで定義されている場合、​`-parameters`​ フラグを使用して Java クラスをコンパイルするように Maven コンパイラープラグインを ​`pom.xml`​ で設定する必要があります。

```xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <compilerArgs>
            <arg>-parameters</arg>
        </compilerArgs>
    </configuration>
</plugin>
```

## [](#dataweave-を使用したメソッドの呼び出し)DataWeave を使用したメソッドの呼び出し

Java Module には、​`invoke`​ 操作と同じ機能を DataWeave 式内で提供する DataWeave 関数 (​`Java::invoke`​) もあります。この手法は、​`boolean`​ 値を返すメソッドで特に役立ちます。この関数は、オブジェクトの完全なクラス名、実行するインスタンスメソッド、インスタンス化されたオブジェクトを引数として取り、メソッドの引数をマップとして取ります。

[\[Invoke Instance Methods\]](<#Invoke Instance Methods>)​ の Java クラスでは、この例は ​`TaxCalculator`​ の新しいインスタンスを作成し、Java Module の ​`invoke`​ 操作を使用して ​`isTaxFree(Double)`​ メソッドをコールする代わりに、​[Choice](https://docs.mulesoft.com/mule-runtime/latest/choice-router-concept)​ コンポーネントに DataWeave 関数を埋め込みます。

```xml
<java:new class="com.foo.TaxCalculator"
	constructor="TaxCalculator()"
	target="taxCalculator"/>

<choice>
    <when
      expression="#[Java::invoke('com.foo.TaxCalculator', 'isTaxFree(Double)', vars.taxCalculator, {price: vars.price})]">
        <flow-ref name="skipTax" />
    </when>
</choice>
```

## [](#静的メソッドの呼び出し)静的メソッドの呼び出し

静的 Java メソッドを呼び出す方法の例を次に示します。

```xml
<java:invoke-static
	class="java.lang.Math"
	method="toRadians(double)">
    <java:args>#[{
        arg0: 180
    }]</java:args>
</java:invoke-static>
```

## [](#studio_example)Studio での New 操作および Invoke 操作

Anypoint Studio では、Java パッケージをプロジェクトに書き込みまたは読み込み、1 つ以上のフロー内で Java 操作を設定してから、その操作が存在する Mule アプリケーションを実行できます。

![Java Module の例](/mulesoft/current/ja-jp/java-module/latest/_images/java-module-ex.png)

この例では、Mule アプリケーションに 2 つのフローをセットアップします。

1. 小さな Java パッケージ (​`com.examples`​) を記述します。
2. インスタンスメソッド (​`Hello.java`​ と ​`Add.java`​) を含む 2 つのシンプルな Java クラスを記述します。
3. Apache Maven コンパイラープラグインを使用して、​`arg0`​、​`arg1`​ などではなく、設定で名前付きパラメーターを使用できる方法でクラスをコンパイルします。
4. Java Module の ​**New**​ 操作を使用して、​`Hello`​ と ​`Add`​ オブジェクトをインスタンス化し、インスタンスメソッド内の名前付きパラメーターにアクセスします。
5. Java Module の ​**Invoke**​ 操作を使用して、​`hello()`​ と ​`add(3,4)`​ インスタンスメソッドを呼び出します。
6. Mule アプリケーションを実行して、Studio で ​**New**​ 操作と ​**Invoke**​ 操作を実行します。

次のような 2 つのシンプルな Java クラスでメソッドを呼び出すとします。

インスタンスメソッドのある Hello クラス

```java
package com.examples;

public class Hello {

  //Constructor
  public Hello() { }

  //Instance method: hello()
  //Returns the string "helloWorld".
  public String hello() {
    return "helloWorld";
  }
}
```

パラメーター化されたインスタンスメソッドのあるクラスの追加

```java
public class Add {

  public int x = 0;
  public int y = 0;

  //Constructor
  public Add(int numA, int numB) {
	        x = numA;
	        y = numB;
  }

  //Instance method with parameters: add(int x, int y).
  //Returns the sum of inputs x and y.
  public int add(int x, int y) {
    return x + y;
  }
}
```

`hello()`​ と ​`add()`​ を呼び出す Mule アプリケーションを作成する方法

1. Studio で、​**\[File (ファイル)\]**​ > ​**\[New (新規)\]**​ > ​**\[Project (プロジェクト)\]**​ を選択し、プロジェクト名 (​`javaexamples`​) を指定して、​**\[Finish (完了)\]**​ をクリックします。
2. **Package Explorer**​ で Mule プロジェクトの ​`src/main/java`​ ディレクトリを右クリックして、クラスの Java パッケージを作成します。
3. **\[New (新規)\]**​ > ​**\[Package (パッケージ)\]**​ を選択します。
4. **\[Name (名前)\]**​ 項目に「​`com.examples`​」というパッケージ名を指定します。
5. **\[Finish (完了)\]**​ をクリックします。
    
    `src/main/java`​ ディレクトリに ​`com.examples`​ パッケージが表示されていることを確認します。
6. Studio で新しい ​`com.examples`​ パッケージを右クリックして ​**\[New (新規)\]**​ > ​**\[Class (クラス)\]**​ を選択し、​`Hello`​ クラスと ​`Add`​ クラスの Java コードを新しい ​`com.examples`​ パッケージに追加します。
7. **\[Name (名前)\]**​ 項目で、​`Hello`​ クラスの「​`Hello.java`​」という名前を入力し、​**\[Finish (完了)\]**​ をクリックします。
8. その後のリストから、​`Hello`​ クラスコンテンツをコピーして ​`Hello.java`​ ファイルに貼り付けます。
    
    ファイル全体が次のようになり、先頭に ​`package com.examples`​ と表示されます。
    
    ```java
    package com.examples;
    
    public class Hello {
    
      //Constructor
      public Hello() { }
    
      //Instance method: hello()
      //Returns the string "helloWorld".
      public String hello() {
        return "helloWorld";
      }
    }
    ```
9. Studio で新しい ​`com.examples`​ パッケージを右クリックして、​**\[New (新規)\]**​ > ​**\[Class (クラス)\]**​ を選択します。
10. **\[Name (名前)\]**​ 項目に「​`Add.java`​」値を入力します。
11. **\[Finish (完了)\]**​ をクリックします。
12. クラスコンテンツをコピーして ​`Add.java`​ ファイルに貼り付けます。
    
    ファイル全体が次のようになり、先頭に ​`package com.examples`​ と表示されます。
    
    ```java
    package com.examples;
    
    public class Add {
    
      public int x = 0;
      public int y = 0;
    
      //Constructor
      public Add(int numA, int numB) {
              x = numA;
              y = numB;
      }
    
      //Instance method with parameters: add(int x, int y).
      //Returns the sum of inputs x and y.
      public int add(int x, int y) {
        return x + y;
      }
    }
    ```
13. Studio の ​**\[javaexamples\]**​ タブをクリックして、Mule アプリケーションに戻り、​`Hello`​ クラスのフローと ​`hello()`​ メソッドをセットアップします。
    
    1. **\[javaexamples\]**​ で、​**Scheduler**​ コンポーネントを Studio キャンバスにドラッグして、フローのトリガーを指定します。
        
        省略可能: **Scheduler**​ コンポーネントの頻度をデフォルト以外の値に設定することもできます。たとえば、​**\[Frequency (頻度)\]**​ を \[​`10`​\]、​**\[Time unit (時間単位)\]**​ を \[​`SECONDS`​\] に設定します。
    2. Mule パレットで Java Module が選択可能になっていない場合は、​**\[Add Module (モジュールの追加)\]**​ をクリックして、Java Module をパレットの左列にドラッグします。
    3. Java Module をクリックし、その ​**New**​ 操作をフローの Scheduler の右側に配置してから、操作をダブルクリックして設定します。
        
        - **Class (クラス)**​: `com.examples.Hello`
        - **Constructor (コンストラクター)**​: `Hello()`
            
            **\[Constructor (コンストラクター)\]**​ 設定の ​**\[fx\]**​ はクリックしないでください。
    4. **Invoke**​ 操作をフローの ​**New**​ 操作の右側に配置してから、操作をダブルクリックして設定します。
        
        - **\[Instance (インスタンス)\]**​ 項目で、​**\[fx\]**​ をクリックし、値を \[​`payload`​\] に設定します。
        - **\[Class (クラス)\]**​ 項目: `com.examples.Hello`
        - **\[Method (メソッド)\]**​ 項目: `hello()`
            
            **\[Method (メソッド)\]**​ 設定の ​**\[fx\]**​ はクリックしないでください。
    5. **Logger**​ コンポーネントを見つけて、フローの ​**Invoke**​ 操作の右側にドラッグし、その ​**\[Message (メッセージ)\]**​ 項目で ​**\[fx\]**​ をクリックして「​`payload`​」と入力します。
    6. **Flow Reference**​ コンポーネントを見つけて、​**Logger**​ コンポーネントの右側にドラッグし、このコンポーネントをダブルクリックして、​**\[Flow Name (フロー名)\]**​ 項目を \[​`javaexamplesFlow1`​\] に設定します。これは、次のステップで作成する新しいフローの名前です。
14. 新しい ​**Flow**​ コンポーネントを既存のフローの下にドラッグして、新しいフローをセットアップします。この際、その名前が ​`javaexamplesFlow1`​ であることを確認します (つまり、他のフローの ​**\[Flow Reference (フロー参照)\]**​ 設定がこの新しいフローの名前と一致します)。
    
    1. Java Module をクリックして、​**New**​ 操作を新しい ​`javaexamplesFlow1`​ フローの ​**\[Process (プロセス)\]**​ セクションにドラッグしてから、この操作に次の設定を指定します。
        
        - **Args (引数)**​: 引数の ​`{ "numA" : 5, "numB" : 6}`​。
        - **Class (クラス)**​: `com.examples.Add`
        - **Constructor (コンストラクター)**​: `Add(int,int)`
            
            **\[Constructor (コンストラクター)\]**​ 設定の ​**\[fx\]**​ はクリックしないでください。
    2. **Invoke**​ 操作を新しいフローの ​**New**​ 操作の右側に配置してから、次の設定を指定します。
        
        - **\[fx\]**​ をクリックし、​**\[Instance (インスタンス)\]**​ 項目を \[​`payload`​\] に設定します。
        - **Args (引数)**​: 呼び出し時に処理する引数の ​`{ "x" : 3, "y" : 4}`
        - **Class (クラス)**​: `com.examples.Add`
        - **Method (メソッド)**​: `add(int,int)`
            
            **\[Method (メソッド)\]**​ 設定の ​**\[fx\]**​ はクリックしないでください。
    3. **New**​ 操作の処理を続行し、​**\[Advanced (詳細)\]**​ 設定リンクをクリックして、​**\[Output (出力)\]**​ 値を Invoke 操作のペイロードを保存する対象変数に設定します。
        
        - **Target Variable (対象変数)**​: `mySum`
        - **Target Value (対象値)**​: `payload`
            
            このステップでは、ペイロードを対象変数に渡す必要が生じた場合の方法を示しています。
    4. **Logger**​ コンポーネントを新しいフローの ​**Invoke**​ 操作の右側に配置し、​**\[fx\]**​ をクリックして、​**\[Message (メッセージ)\]**​ 項目を \[​`vars.mySum`​\] に設定します。
        
        この ​**\[Logger (ロガー)\]**​ 設定は、Studio コンソールの対象変数に保存されるペイロードの表示用です。
15. 名前付きパラメーターを見やすくするために、Mule コンパイラープラグインの XML を Mule プロジェクトの ​`pom.xml`​ ファイルに追加します。
    
    1. **Package Explorer**​ で、​**javaexamples**​ プロジェクトの下部にある ​`pom.xml`​ をダブルクリックします。
    2. Mule コンパイラープラグインの XML を ​`pom.xml`​ ファイルの ​`<build><plugins></plugins></build>`​ 要素の間に追加し、ここに定義済みのプラグインがあれば保持します。
        
        ```xml
        <build>
          <plugins>
            <!-- any other plugins -->
        ```
        
        この XML を POM ファイルに貼り付けます。
        
        ```xml
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.1</version>
              <configuration>
                <parameters>true</parameters>
                <source>1.8</source>
                <target>1.8</target>
                </configuration>
            </plugin>
        ```
        
        ```xml
        </plugins>
        </build>
        ```
        
        Maven コンパイラープラグインの XML を追加せずに、​**New**​ 操作で指定したパラメーターを使用しようとすると、​**New**​ 操作が失敗し、次のようなメッセージが表示されます。
        
        `Failed to instantiate Class [com.examples.Add] with arguments [Integer numA, Integer numB]. (引数 [Integer numA, Integer numB] でのクラス [com.examples.Add] のインスタンス化に失敗しました。) Expected arguments are [int arg0, int arg1] (期待される引数は [int arg0, int arg1] です)`
16. Studio で ​**\[javaexamples\]**​ タブをクリックして、Mule アプリケーションに戻ります。
17. 上部の一連のメニューから ​**\[Run (実行)\]**​ > ​**\[Run (実行)\]**​ を選択して、Mule アプリケーションを実行します。
18. プロジェクトが正常にデプロイされたら、​**\[Console (コンソール)\]**​ で出力が予想どおりであることを確認します。
    
    コンソールには次のような出力が表示されます (読みやすいように短縮してあります)。
    
    ```txt
    INFO  2019-09-22 09:21:32 ... [event: 4c31f...] ... LoggerMessageProcessor: helloWorld
    INFO  2019-09-22 09:21:32 ... [event: 4c31f...] ... LoggerMessageProcessor: 7
    ```
    
    - `helloWorld`​ は ​**javaexamplesFlow**​ の出力値です。
    - `7`​ は ​**javaexamplesFlow1**​ の出力値です。

## [](#関連情報)関連情報

- [Throwable の処理](https://docs.mulesoft.com/jp/java-module/latest/java-throwable)
- [Java Module の引数変換](https://docs.mulesoft.com/jp/java-module/latest/java-argument-transformation)
- [Java Module リファレンス](https://docs.mulesoft.com/jp/java-module/latest/java-reference)