ドキュメンテーション

目次

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Java オブジェクトの作成と使用

概要

MATLAB® ワークスペースに Java® オブジェクトを作成するには、そのクラスのコンストラクターのいずれかを呼び出します。次に、コマンドとプログラミング ステートメントを使用して、これらのオブジェクトで演算を実行します。また、Java オブジェクトを MAT ファイルに保存し、後続のセッションでそれらを MATLAB に再度読み込むこともできます。

Java オブジェクトの構築

クラスと同じ名前の Java クラス コンストラクターを呼び出して、MATLAB ワークスペースで Java オブジェクトを作成します。たとえば、以下のコンストラクターは myDate オブジェクトを作成します。

myDate = java.util.Date
myDate = 
Thu Aug 23 12:58:54 EDT 2007

MATLAB によってシステムの情報が表示されます。

関数 javaObjectEDT の使用

状況によっては、関数 javaObjectEDT を使用して Java オブジェクトを構築します。以下の構文は、x1,...,xn と一致する引数リストで、クラス class_name の Java コンストラクターを呼び出し、新しいオブジェクト J を返します。

J = javaObjectEDT('class_name',x1,...,xn);

たとえば、クラス java.lang.String の Java オブジェクトを構築して返すには、以下を入力します。

strObj = javaObjectEDT('java.lang.String','hello');

関数 javaObjectEDT により以下が可能です。

  • MATLAB 識別子の最大長を超える名前をもつクラスの使用 (関数 namelengthmax を呼び出して、最大識別子長を取得します)。

  • 実行時におけるオブジェクトのクラスの指定 (たとえば、アプリケーション ユーザーからの入力による指定)。

既定の MATLAB コンストラクター構文では、入力クラス名のセグメントは namelengthmax の文字数を超えることはできません。("クラス名セグメント" とは、ドットの前、間、後ろにあるクラス名の任意の部分を指します。たとえば、クラス java.lang.String には 3 つのセグメントがあります)。MATLAB は、namelengthmax の文字数を超えるクラス名セグメントを切り捨てます。まれに、この長さのクラス名を使用する場合は、関数 javaObjectEDT を使用して該当のクラスをインスタンス化します。

関数 javaObjectEDT を使用すると、構築されるオブジェクトの Java クラスを実行時に指定することもできます。この場合は、クラス名引数の代わりに文字列変数を使って関数 javaObjectEDT を呼び出します。

class  = 'java.lang.String';
text = 'hello';
strObj = javaObjectEDT(class, text);

通常、インスタンス化するクラスが開発時に把握されている場合は、MATLAB コンストラクター構文を使用する方が便利です。たとえば、java.lang.String オブジェクトを作成するには、以下を入力します。

strObj = java.lang.String('hello');

Java Class.forName メソッドの代わりに関数 javaObjectEDT を使用します。たとえば、次のステートメント

java.lang.Class.forName('xyz.myapp.MyClass')

を次に置き換えます。

javaObjectEDT('xyz.myapp.MyClass')

    メモ:    一般的に、関数 javaObjectEDT を使用する必要はありません。Java クラスをインスタンス化するための既定の MATLAB 構文は単純で、多くのアプリケーションに適しています。関数 javaObjectEDT は基本的に上記の場合に使用してください。

MATLAB アプリケーションの参照としての Java オブジェクト

MATLAB では、Java オブジェクトは "参照" であり、MATLAB の代入時コピーおよび値受け渡しのルールには従いません。以下に例を示します。

myDate = java.util.Date;
setHours(myDate,10)
newDate = myDate;

この例では、変数 newDatemyDate への参照であり、オブジェクトのコピーではありません。newDate によって参照されるオブジェクトへの変更により myDate のオブジェクトも変わります。MATLAB コードでも Java コードでもオブジェクトを変更できます。

以下の例では、myDatenewDate が同じオブジェクトへの参照です。一方の参照 (newDate) で時刻を変更すると、その変更内容はもう一方の参照 (myDate) にも反映されます。

setHours(newDate,8)
myDate.getHours
ans =
     8

Java オブジェクトの連結

Java オブジェクトは、ネイティブの MATLAB の型を連結するのと同じ方法で連結できます。関数 cat または [ ] 演算子を使用して、囲まれているオブジェクトを単一のオブジェクトに組み合わせるように MATLAB に指示します。

同じクラスのオブジェクトの連結

同じ Java クラスのオブジェクトを連結する場合、連結は同じクラスからのオブジェクトの配列になります。

以下の例では、関数 cat によってクラス java.awt.Integer の 2 つのオブジェクトが連結されます。その結果のクラスは、java.awt.Integer になります。

value1 = java.lang.Integer(88);
value2 = java.lang.Integer(45);
cat(1, value1, value2)
ans = 
java.lang.Integer[]:
    [88]
    [45]

異なるクラスのオブジェクトの連結

異なるクラスのオブジェクトを連結する場合、MATLAB はすべての入力オブジェクトが継承する 1 つのクラスを見つけます。連結はこのクラスのインスタンスになります。MATLAB は、Java クラス階層で最も下位の共通の親を出力クラスに選びます。

たとえば、java.lang.Bytejava.lang.Integer および java.lang.Double のオブジェクトを連結すると、3 つの入力クラスの共通の親である java.lang.Number のオブジェクトが作成されます。

byte = java.lang.Byte(127);
integer = java.lang.Integer(52);
double = java.lang.Double(7.8);
[byte; integer; double]
ans =
java.lang.Number[]:
    [   127]
    [    52]
    [7.8000]

共通の下位レベルの親が存在しない場合、結果のクラスは、Java クラス階層全体のルートである java.lang.Object になります。

byte = java.lang.Byte(127);
point = java.awt.Point(24,127);
[byte; point]
ans =
java.lang.Object[]:
    [               127]
    [1x1 java.awt.Point]

Java オブジェクトの MAT ファイルへの保存と読み込み

関数 save を使用して Java オブジェクトを MAT ファイルに保存します。そのオブジェクトを MAT ファイルから MATLAB に読み込むには、関数 load を使用します。Java オブジェクトを保存または読み込むには、オブジェクトとそのクラスが次のすべての条件を満たさなければなりません。

  • 直接または親クラスからの継承によって、クラスが Serializable インターフェイス (Java API の一部) を実装している。すべての組み込みオブジェクトまたは参照されるオブジェクトも Serializable を実装しなければなりません。

  • クラスの定義がオブジェクトの保存と読み込みで変化しない。クラスのデータ フィールドやメソッドが変更されると、以前のクラス定義で構築されたオブジェクトの読み込み (逆シリアル化) ができなくなります。

  • クラスが一時的なデータ フィールドをもたない、または保存対象のオブジェクトの一時的なデータ フィールドの値が重要ではない。一時的なデータ フィールドの値がオブジェクトで保存されることはありません。

独自の Java クラス、または既存クラスのサブクラスを定義する場合、前述の条件に従うことによりクラスのオブジェクトを MATLAB に保存したり読み込んだりできるようになります。シリアル化をサポートするクラスの定義の詳細は、Java 開発ドキュメンテーションを参照してください。

オブジェクトのパブリック データ フィールドの検出

Java オブジェクトに属するパブリック フィールドをリストするには、これらの形式のいずれかを利用する関数 fieldnames を使用します。

names = fieldnames(obj)
names = fieldnames(obj,'-full')

-full を使用せずに関数 fieldnames を呼び出すと、オブジェクトのすべてのデータ フィールド (継承されたフィールドを含む) の名前が返されます。-full 修飾子を使用すると、関数 fieldnames は、そのオブジェクトに定義されているデータ フィールドの、型、属性、継承情報を含む完全な記述を返します。

たとえば、以下のコマンドで Integer オブジェクトを作成します。

value = java.lang.Integer(0);

value のデータ フィールドの記述を完全に表示するには、以下を入力します。

fieldnames(value,'-full')
ans = 
    'static final int MIN_VALUE'
    'static final int MAX_VALUE'
    'static final java.lang.Class TYPE'
    'static final int SIZE'

プライベート データとパブリック データへのアクセス

Java API クラスは、"プライベート" データ フィールドの読み取りおよび、許可されている場合は、変更に使用可能なアクセサー メソッドを提供します。これらのメソッドはそれぞれ、get メソッド、set メソッドと呼ばれることがあります。

Java クラスには、コードが読み取りや変更を直接行うことができる "パブリック" データ フィールドをもつものがあります。このフィールドにアクセスするには、構文 object.field を使用します。

java.awt.Frame クラスは、プライベートおよびパブリックの両方のデータ フィールドへのアクセスの例を提供します。このクラスには、java.awt.Dimension オブジェクトを返す読み取りアクセサー メソッドの getSize があります。Dimension オブジェクトには heightwidth のデータ フィールドがあり、これはパブリックで直接アクセスできます。たとえば、このデータにアクセスするには、以下を入力します。

frame = java.awt.Frame;
frameDim = getSize(frame);
height = frameDim.height;
frameDim.width = 42;

この章のプログラミングの例には、データ フィールド アクセサーの呼び出しも含まれています。たとえば、「インターネット プロトコル アドレスの取得」のサンプル コードでは、java.net.InetAddress オブジェクトでアクセサーの呼び出しを使用します。

hostname = address.getHostName; 
ipaddress = address.getHostAddress;

静的フィールドからのデータ アクセス

Java 言語プログラムにおいて、"静的データ フィールド" はオブジェクトのクラス全体に適用されるフィールドです。静的フィールドは、クラス名そのものと関連して最も一般的にアクセスされます。たとえば、以下のコードでは、パッケージとクラスの名前 java.lang.Integer を使用して Integer クラスの TYPE フィールドにアクセスしています。

thisType = java.lang.Integer.TYPE;

MATLAB では、同じ構文を使用できます。また、クラスのインスタンスとして TYPE フィールドを参照することもできます。以下の例では、value と呼ばれる java.lang.Integer のインスタンスを作成し、パッケージ名とクラス名ではなく value という名前を使用して TYPE フィールドにアクセスします。

value = java.lang.Integer(0);
thatType = value.TYPE
thatType =
int

静的フィールドへの割り当て

クラスの静的な set メソッドを使用して静的フィールドに値を代入します。また、クラスのインスタンスを使用して値を代入することもできます。詳細は、「静的フィールドからのデータ アクセス」を参照してください。以下の例では、クラスのインスタンスとしてフィールド staticFieldName を参照することによって、このフィールドに value を割り当てます。

objectName = java.className;
objectName.staticFieldName = value;

    メモ:    MATLAB では、クラス名そのものを使用した静的フィールドへの割り当てはできません。

オブジェクトのクラスの確認

Java オブジェクトのクラスを検出するには、関数 class のクエリ フォームを使用します。以下の例の実行後、myClass には、オブジェクト value によりインスタンス化されるパッケージとクラスの名前が含まれます。

value = java.lang.Integer(0);
myClass = class(value)
myClass =
java.lang.Integer

この class の形式も MATLAB オブジェクトで機能するため、これ自体では Java クラスであるかどうかは判断できません。クラスの型を確認するには、関数 isjava を使用します。この関数は、obj が Java オブジェクトの場合は 1 を、そうでない場合は 0 を返します。たとえば以下のように入力します。

isjava(value)
ans =
     1

オブジェクトが指定されたクラスのインスタンスかどうかを確認するには、関数 isa を使用します。このクラスは Java クラスであると共に、MATLAB 組み込みクラスまたはユーザー定義のクラスです。たとえば、次のように入力します。

isa(value, 'java.lang.Integer')
ans =
     1
この情報は役に立ちましたか?