Java の統合
Java は CFML の中核となるものです。このリリースでは、CFML コードのブロックを含んだ Java クラスを作成し、そのコードを実行することができます。CFML ブロック内で Java オブジェクトのインスタンスを作成し、中核となる Java コンストラクトを書き込むことができます。
スクリプトのシンタックス
<cfscript>
classInstance = java{
public class class1{
public int execute ()
{
int[] arr;
arr = new int[5];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;
return arr.length;
}
}
}
writeoutput(classInstance.execute())
</cfscript>
出力
5
タグのシンタックス
<cfjava handle="classInstance" >
import java.io.*;
public class Harmless{
private String ss = "John";
public Harmless(String s){
this.ss = s;
}
public void write(String path) throws Exception{
File file = new File(path);
file.createNewFile();
FileWriter fr = new FileWriter(file, true);
BufferedWriter br = new BufferedWriter(fr);
PrintWriter pr = new PrintWriter(br);
pr.println("new content from java added " + this.ss);
pr.close();
br.close();
fr.close();
}
public String read (String path) throws Exception{
File file = new File(path);
BufferedReader objReader = null;
String strCurrentLine;
String cont = "";
objReader = new BufferedReader(new FileReader(path));
while ((strCurrentLine = objReader.readLine()) != null) {
cont= cont + "--" + strCurrentLine;
}
objReader.close();
return cont;
}
}
</cfjava>
<cfset classInstance.init("content from cf")> <!--- calling constructor using init()--->
<cfset path = ExpandPath('./') & 'temp.txt'>
<cfset classInstance.write(path)> <!--- Calling the method write() of Class Harmless --->
<cfoutput>#classInstance.read(path)#</cfoutput> <!--- Calling the method read() of Class Harmless --->
出力
--new content from java added content from cf
Java インターフェイスの実装と拡張のサポート
コンポーネントおよび ColdFusion インターフェイスで Java インターフェイスの機能を拡張することができます。ColdFusion コンポーネントでは、指定された Java インターフェイスリストを実行時に実装するだけで、他の Java オブジェクトと同様に動作させることができるようになりました。また、ColdFusion インターフェイスで Java インターフェイスを拡張することができます。Java オブジェクトを想定していたメソッドに CFC を直接渡すこともできるようになりました。
使用方法
次のいずれかの方法になります。
component implements = “java:java.util.List, Test.AnotherCFInterface, java:com.adobe.MyInterface”
{
// provide mandatory implementation to all abstract method listed in interface OR provide implementation of onMissingMethod here.
}
<cfinterface extends = "java:java.util.Map"> </cfinterface>
<cfcomponent implements = "java:java.util.Map"> </cfcomponent>
CFC でインターフェイスまたはインターフェイスリストを実装する場合は、CFC または抽象 CFC の実装対象インターフェイスのすべての抽象メソッドを実装する必要があります。
必ずしもすべての抽象メソッドを実装しない場合は、onMissingMethod を実装するだけでも十分です。
同じ名前と同じパラメーターシグネチャを持つメソッドがクラスの 2 つ以上のインターフェイスに含まれている場合、インターフェイスの順序が重要になります。
例 1
Case1.java
import java.util.List;
import java.util.Map;
public class TestCase1 {
public int getListAndReturnSize(List l){
return l.size();
}
public int getMapAndReturnSize(Map l){
return l.size();
}
}
HelloWorld.cfc
<cfcomponent implements = "java:java.util.List">
<cffunction name="size" returntype = "Numeric" >
<cfreturn 53.8>
</cffunction>
<cffunction
name="OnMissingMethod"
access="public"
returntype="any"
output="false"
hint="Handles missing method exceptions.">
<!--- Define arguments. --->
<cfargument
name="MissingMethodName"
type="string"
required="true"
hint="The name of the missing method."
/>
<cfargument
name="MissingMethodArguments"
type="struct"
required="true"
hint="The arguments that were passed to the missing method. This might be a named argument set or a numerically indexed set."
/>
<!--- Dump out the arguments. --->
<cfabort />
<!--- Return out. --->
<cfreturn />
</cffunction>
</cfcomponent>
test.cfm
<cfscript>
newObj=new HelloWorld()
obj = createObject("java","Case1").init()
result = obj.getListAndReturnSize(newObj)
writeOutput(result)
</cfscript>
出力
53
例 2
Case2.java
import java.util.List;
import java.util.Map;
public class Case2 {
public int getListAndReturnSize(List l){
return l.size();
}
public int getMapAndReturnSize(Map l){
return l.size();
}
}
HelloWorld.cfc
component implements = "java:java.util.Map" {
numeric function size() {
return 53.8;
}
public any function onMissingMethod(string MissingMethodName, struct MissingMethodArguments) {
abort;
return;
}
}
Test.cfm
<cfscript>
newObj=new HelloWorld();
obj = createObject("java","Case2").init();
result = obj.getListAndReturnSize(newObj)
writeOutput(result)
</cfscript>
UDF および CFC 関数内の Java コード
タグベースの例
<cfset x = custName('John', 'Doe')>
<cfoutput>#x#</cfoutput>
<cffunction name="custName" type ='java'>
<cfargument name="customerID"
required="false"
restargsource="Path"
type="string"/>
<cfargument name="name"
required="false"
restargsource="Path"
type="string"/>
return new java.lang.StringBuffer(customerID).reverse().toString() + name;
</cffunction>
スクリプトベースの例
<cfscript>
x = custName('John', 'Doe')
writeOutput(x)
function custName(string customerID, string name) type=”java” {
return new java.lang.StringBuffer(customerID).reverse().toString() + name;
}
</cfscript>