この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

Type クラス

Apex クラスに対応する Apex のデータ型を取得し、新しい型をインスタンス化するためのメソッドを含みます。

名前空間

System

使用方法

forName メソッドを使用して、Apex クラス (組み込みクラスまたはユーザ定義クラス) のデータ型を取得します。これらのメソッドを使用して、公開およびグローバルクラスのデータ型を取得できます。ただし、非公開クラスのデータ型はコンテキストユーザがアクセスできる場合でも、取得できません。また、newInstance メソッドは、インターフェースを実装する型をインスタンス化し、そのメソッドをコールすると同時に、パッケージの登録者など他のユーザがメソッドの実装を提供できるようにする場合に使用します。

Type.forName() をコールすると、クラスがコンパイルされる場合があります。

メモ

例: 名前に基づいた Type のインスタンス化

次のサンプルは、Type メソッドを使用して、Type をその名前に基づいてインスタンス化する方法を示します。このシナリオの典型的な応用として、パッケージの登録者が、インストールされたパッケージの一部としてインターフェースのカスタム実装を提供する場合があります。パッケージは、登録者の組織のカスタム設定を介してインターフェースを実装するクラスの名前を取得できます。パッケージは、このクラス名に対応する型をインスタンス化して、登録者が実装したメソッドを呼び出すことができます。

このサンプルでは、VehicleVehicleImpl クラスによって実装されるインターフェースを表します。最後のクラスには、VehicleImpl に実装されたメソッドを呼び出すコードサンプルが含まれます。

これが Vehicle インターフェースです。
1global interface Vehicle {
2    Long getMaxSpeed();
3    String getType();
4}
これが Vehicle インターフェースの実装���す。
1global class VehicleImpl implements Vehicle {
2    global Long getMaxSpeed() { return 100; }    
3    global String getType() { return 'Sedan'; }
4}
このクラスのメソッドは、Vehicle インターフェースを実装するクラスの名前をカスタム設定値を介して取得します。その後、このクラスをインスタンス化するために、対応する型を取得し、newInstance メソッドをコールします。次に、VehicleImpl に実装されたメソッドを呼び出します。このサンプルでは、className という名前のテキスト項目を持つ CustomImplementation という名前の公開リストカスタム設定を作成する必要があります。このカスタム設定のレコードを、Vehicle というデータセット名とクラス名値 VehicleImpl で 1 つ作成します。
1public class CustomerImplInvocationClass {
2
3    public static void invokeCustomImpl() {
4        // Get the class name from a custom setting.
5        // This class implements the Vehicle interface.
6        CustomImplementation__c cs = CustomImplementation__c.getInstance('Vehicle');
7        
8        // Get the Type corresponding to the class name
9        Type t = Type.forName(cs.className__c);
10        
11        // Instantiate the type.
12        // The type of the instantiated object 
13        //   is the interface.
14        Vehicle v = (Vehicle)t.newInstance();
15        
16        // Call the methods that have a custom implementation
17        System.debug('Max speed: ' + v.getMaxSpeed());
18        System.debug('Vehicle type: ' + v.getType());       
19    }
20}

クラスのプロパティ

class プロパティは、コールされたデータ型の System.Type を返します。これは、プリミティブデータ型とコレクション、sObject 型、ユーザ定義クラスを含むすべての Apex 組み込みデータ型で公開されます。forName メソッドの代わりにこのプロパティを使用できます。

データ型名に対してこのプロパティをコールします。次に例を示します。
1System.Type t = Integer.class;

JSON.deserializedeserializeStrictJSONParser.readValueAsreadValueAsStrict メソッドの 2 番目の引数にこのプロパティを使用して、デシリアライズするオブジェクトのデータ型を取得できます。次に例を示します。

1Decimal n = (Decimal)JSON.deserialize('100.1', Decimal.class);

Type のメソッド

Type のメソッドは次のとおりです。

equals(typeToCompare)

指定されたデータ型が現在のデータ型と同じ場合は true を返し、そうでない場合は false を返します。

署名

public Boolean equals(Object typeToCompare)

パラメータ

typeToCompare
型: Object
現在のデータ型と比較するデータ型です。

戻り値

型: Boolean

1Type t1 = Account.class;
2Type t2 = Type.forName('Account');
3System.assert(t1.equals(t2));

forName(fullyQualifiedName)

指定された完全修飾クラス名に対応するデータ型を返します。

署名

public static System.Type forName(String fullyQualifiedName)

パラメータ

fullyQualifiedName
型: String
データ型を取得するクラスの完全修飾名です。完全修飾クラス名には、MyNamespace.ClassName などの名前空間名が含まれます。

戻り値

型: System.Type

使用方法

  • このメソッドでは、管理パッケージの非グローバルクラスの型を取得するために、管理パッケージ外からコールされた場合は null を返します。これは、非グローバルクラスは管理パッケージ外では参照できないためです。Salesforce API バージョン 27.0 以前を使用して保存された Apex の場合、このメソッドは非グローバルの管理パッケージクラスの対応するクラス種別を返します。
  • 名前空間が定義されていない組織のローカル型の名前を取得するためにインストールされた管理パッケージから forName(fullyQualifiedName) メソッドをコールすると、null が返されます。forName(namespace, name) メソッドを代わりに使用し、namespace 引数に空の文字列または null を指定します。
  • Type.forName() をコールすると、クラスがコンパイルされる場合があります。

メモ

forName(namespace, name)

指定された名前空間およびクラス名に対応するデータ型を返します。

署名

public static System.Type forName(String namespace, String name)

パラメータ

namespace
型: String
クラスの名前空間。クラスに名前空間がない場合、namespace 引数を null または空の文字列に設定します。
name
型: String
クラスの名前です。

戻り値

型: System.Type

使用方法

  • このメソッドでは、管理パッケージの非グローバルクラスの型を取得するために、管理パッケージ外からコールされた場合は null を返します。これは、非グローバルクラスは管理パッケージ外では参照できないためです。Salesforce API バージョン 27.0 以前を使用して保存された Apex の場合、このメソッドは非グローバルの管理パッケージクラスの対応するクラス種別を返します。
  • 名前空間が定義されていない組織にインストールされた管理パッケージからコールする場合には、forName(fullyQualifiedName) の代わりにこのメソッドを使用します。ローカル型の名前を取得するには、namespace 引数を空の文字列または null に設定します。たとえば、Type t = Type.forName('', 'ClassName'); です。
  • Type.forName() をコールすると、クラスがコンパイルされる場合があります。

メモ

この例では、ClassName クラスおよび MyNamespace 名前空間に対応するデータ型を取得する方法を示します。

1Type myType = 
2   Type.forName('MyNamespace', 'ClassName');

getName()

現在の型の名前を返します。

署名

public String getName()

戻り値

型: String

この例では、Type の名前を取得する方法を示します。最初に forName をコールして Type を取得し、次にその Type オブジェクトに対して getName をコールします。

1Type t = 
2   Type.forName('MyClassName');
3
4String typeName = 
5   t.getName();
6System.assertEquals('MyClassName',
7   typeName);

hashCode()

現在のデータ型のハッシュコード値を返します。

署名

public Integer hashCode()

戻り値

型: Integer

使用方法

返されたハッシュコード値は、String.hashCode が返す型名のハッシュコードに対応します。

isAssignableFrom(sourceType)

指定された種別のオブジェク��参照を子種別から割り当てことができる場合は true を返します。できない場合は、false を返します。

署名

public Boolean isAssignableFrom(Type sourceType)

パラメータ

sourceType
互換性チェックで使用するオブジェクトの種別。

戻り値

型: Boolean

メソッドが parentType.isAssignableFrom(childType) として呼び出された場合は、true が返されます。次のいずれかの方法で呼び出された場合、メソッドは false を返します。
  • childType.isAssignableFrom(parentType)
  • typeA.isAssignableFrom(TypeB)。TypeB は TypeA の同階層
  • typeA.isAssignableFrom(TypeB)。TypeB と TypeA は関連性なし

childType が parentType の子になるのは、childType が、インターフェースを実装しているとき、仮想クラスまたは抽象クラスを拡張しているとき、または parentType と同じ System.Type であるときです。

メモ

使用方法

instanceof 演算子とは異なり、このメソッドでは、クラスのインスタンスを作成しなくても、種別の互換性をチェックできます。このメソッドにより、instanceof で必要な静的コンパイル時依存関係が解消されます。

次のコードは、一般的な ISV 顧客が isAssignableFrom() を使用して、顧客定義の種別 (customerProvidedPluginType) と有効なプラグイン種別の互換性をチェックする方法を示しています。
1//Scenario: Managed package code loading a “plugin” class that implements a managed interface; the implementation done outside of the package
2String pluginNameStr = Config__c.getInstance().PluginApexType__c;
3Type customerProvidedPluginType = Type.forName(pluginNameStr);
4Type pluginInterface = ManagedPluginInterface.class;
5
6// Constructors may have side-effects, including potentially unsafe DML/callouts. 
7// We want to make sure the class is really designed to be a valid plugin before we instantiate it
8Boolean validPlugin = pluginInterface.isAssignableFrom(customerProvidedPluginType); // validate that it implements the right interface
9
10if(!validPlugin){
11    throw new SecurityException('Cannot create instance of '+customerProvidedPluginType+'. Does not implement ManagedPluginInterface');
12}else{
13    return Type.newInstance(validPlugin);
14}

次のコードスニペットでは、最初に、Callable インターフェースを実装する同階層のクラス A および B と、関連性のないクラス C が定義されています。次に、isAssignableFrom() を使用して、いくつかの種別の比較が探索されています。

1//Define classes A, B, and C
2
3global class A implements Database.Batchable<String>, Callable {
4    global Iterable<String> start(Database.BatchableContext context) { return null; }
5    global void execute(Database.BatchableContext context, String[] scope) { }
6    global void finish(Database.BatchableContext context) { }
7    global Object call(String action, Map<String, Object> args) { return null; }
8}
1global class B implements Callable {
2    global Object call(String action, Map<String, Object> args) { return null; }
3}
1global class C { }
1Type listOfStrings = Type.forName('List<String>');
2Type listOfIntegers = Type.forName('List<Integer>');
3boolean flagListTypes = listOfIntegers.isAssignableFrom(listOfStrings); // false
1//Examples with stringType and idType
2Type stringType = Type.forName('String');
3Type idType = Type.forName('Id');
4boolean isId_assignableFromString = idType.isAssignableFrom(stringType); // true
5//isAssignableFrom respects that String can be assigned to Id without an explicit cast
1//Examples with typeA, typeB, and typeC
2Type typeA = Type.forName('A');
3Type typeB = Type.forName('B');
4Type typeC = Type.forName('C');
5boolean isTypeB_ofTypeA = typeB.isAssignableFrom( typeA ); // false - siblings
6boolean isTypeA_ofTypeC = typeA.isAssignableFrom( typeC ); // false - unrelated types
7boolean isTypeA_ofTypeA = typeA.isAssignableFrom(typeA); // true - identity
1//Examples with callableType and batchableType
2Type callableType = Type.forName('Callable');
3Type batchableType = Type.forName('Database.Batchable');
4boolean isTypeA_Callable = callableType.isAssignableFrom( typeA ); // true - type A is a child of Callable type
5boolean isTypeA_Batchable = batchableType.isAssignableFrom( typeA ); // true - type A is a child of Batchable type
6boolean isCallableOfTypeA = typeA.isAssignableFrom( callableType ); // false - Callable type is not a child of type A
7boolean isBatchableOfTypeA = typeA.isAssignableFrom( batchableType ); // false - Batchable type is not a child of type A

newInstance()

現在の型のインスタンスを作成し、この新しいインスタンスを返します。

署名

public Object newInstance()

戻り値

型: Object

使用方法

newInstance は汎用オブジェクト型を返すため、この値を保持する変数の型に戻り値を変換する必要があります。

このメソッドを使用すると、インターフェースを実装する Type をインスタンス化し、そのメソッドをコールできると同時に、他のユーザがメソッドの実装を提供できるようになります。たとえば、パッケージ開発者がインターフェースを提供し、登録者がそのインターフェースを実装してパッケージをインストールできます。パッケージのコードは、登録者の Type をインスタンス化することで、登録者のインターフェースメソッドの実装をコールします。

次の例では、Type のインスタンスを作成する方法を示します。最初に forName をクラスの名前 (ShapeImpl) でコールして Type を取得し、次にこの Type オブジェクトに対して newInstance をコールします。newObj インスタンスは、ShapeImpl クラスが実装するインターフェース型 (Shape) を使用して宣言されます。newInstance メソッドの戻り値は、Shape 型に変換されます。

1Type t = 
2   Type.forName('ShapeImpl');
3
4Shape newObj = 
5   (Shape)t.newInstance();

toString()

現在のデータ型 (データ型名) を文字列表現で返します。

署名

public String toString()

戻り値

型: String

使用方法

このメソッドは、getName と同じ値を返します。String.valueOf および System.debug はこのメソッドを使用して、Type 引数を string に変換します。

この例では、Integer のリストに対応する Type に対して toString をコールします。

1Type t = List<Integer>.class;
2String s = t.toString();
3System.assertEquals('List<Integer>', s);