Type クラス
名前空間
使用方法
例: 名前に基づいた Type のインスタンス化
次のサンプルは、Type メソッドを使用して、Type をその名前に基づいてインスタンス化する方法を示します。このシナリオの典型的な応用として、パッケージの登録者が、インストールされたパッケージの一部としてインターフェースのカスタム実装を提供する場合があります。パッケージは、登録者の組織のカスタム設定を介してインターフェースを実装するクラスの名前を取得できます。パッケージは、このクラス名に対応する型をインスタンス化して、登録者が実装したメソッドを呼び出すことができます。
このサンプルでは、Vehicle が VehicleImpl クラスによって実装されるインターフェースを表します。最後のクラスには、VehicleImpl に実装されたメソッドを呼び出すコードサンプルが含まれます。
1global class VehicleImpl implements Vehicle {
2 global Long getMaxSpeed() { return 100; }
3 global String getType() { return 'Sedan'; }
4}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.deserialize、deserializeStrict、JSONParser.readValueAs、readValueAsStrict メソッドの 2 ��目の引数にこのプロパティを使用して、デシリアライズするオブジェクトのデータ型を取得できます。次に例を示します。
1Decimal n = (Decimal)JSON.deserialize('100.1', Decimal.class);Type のメソッド
Type のメソッドは次のとおりです。
equals(typeToCompare)
署名
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
使用方法
forName(namespace, name)
署名
public static System.Type forName(String namespace, String name)
パラメータ
戻り値
型: System.Type
使用方法
例
この例では、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)
署名
public Boolean isAssignableFrom(Type sourceType)
パラメータ
- sourceType
- 互換性チェックで使用するオブジェクトの種別。
戻り値
型: Boolean
- childType.isAssignableFrom(parentType)
- typeA.isAssignableFrom(TypeB)。TypeB は TypeA の同階層
- typeA.isAssignableFrom(TypeB)。TypeB と TypeA は関連性なし
使用方法
instanceof 演算子とは異なり、このメソッドでは、クラスのインスタンスを作成しなくても、種別の互換性をチェックできます。このメソッドにより、instanceof で必要な静的コンパイル時依存関係が解消されます。
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); // false1//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 cast1//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 - identity1//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 AnewInstance()
署名
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);