简介:dsci提供建立和处理组件对象在data step程序中,javaobj就是这样的一个对象,其提供类似jni的机制,可实例化java类,访问对象属性和方法
定义java对象
其由declare语法支持:
| declare javaobj j("类名"); |
这样将定义和存储一个对象的实例在标量j中, javaobj会将java classpath下的somejavaclass实例化呈现出来
典型的,为确保实例化j只一次,可以这样做
| if _n_ = 1 then do; declare javaobj j("somejavaclass"); end; |
javaobj也能使用_new_ 语法进行实例化
| declare javaobj j; j = _new_ javaobj("somejavaclass"); |
构造参数
javaobj构造一个对象的实例的第一个参数是java类的名字,如建立一个hashtable对象
| declare javaobj h("java/util/hashtable"); |
其他相应的参数也可以依次传给java class本身
如建立一个容量为100、系数为0.8的hashtable对象,我们应该封装java/util/hashtable类且在data step中实例化它
| import java.util.*; public class mhash extends hashtable declare javaobj h("mhash", 100, .8); |
封装类是必须的,因为data step中的数字类型对应java中的double
访问对象属性
一旦对象被实例化,javaobj是容许用户用方法访问和修改对象属性,如设想我们由这样一个类
| import java.util.*; import java.lang.*; public class ttest { public int i; public double d; public string s; } |
我们建立这个类的实例,用set/get访问对象属性在下列程序中
| data _null_; dcl javaobj j("ttest"); length val 8; length str $20; j.setintfield("i", 100); j.setdoublefield("d", 3.14159); j.setstringfield("s", "abc"); j.getintfield("i", val); |
set/get方法的第一个参数是属性名,第二个参数是get/set的变量或值
访问对象方法
可以把上面的类改造成这样
| import java.util.*; import java.lang.*; public class ttest { public int i; public double d; public string s; public int im() public string sm() public double dm() |
我们可以通过javaobj方法调用访问java 值,如
| data _null_; dcl javaobj j("ttest"); length val 8; length str $20; j.setintfield("i", 100); j.setdoublefield("d", 3.14159); j.setstringfield("s", "abc"); |
| j.callintmethod("im", val); put val=; j.calldoublemethod("dm", val); put val=; j.callstringmethod("sm", str); put str=; run; |
注:方法的返回值总是被指定为最后一个参数,例如,我们有个返回为double的方法
| public double m(double x, double y) { return x * y; } |
那么在data step中调用该方法用下列语法
| length val1 val2 ret 8; j.calldoublemethod("m", val1, val2, ret); |
访问类的属性和方法
访问类的静态属性和方法,我们可以使用相应的javaobj方法,例如
| import java.util.*; import java.lang.*; public class ttestc { public static double d; public static double dm() { return d; } } |
在data step中调用
| data x; dcl javaobj j("ttestc"); length d 8; j.callsetstaticdoublefield("d", 3.14159); |
数据类型使用
java数据类型集是data step的超集,后者的主要类型是数字型和字符型,而java除了包含数字型和字符型还含有如byte,char,short等类型。
当使用javaobj方法调用是所有java数字类型对应data step中的数组类型,java string则映射到data step的字符类型(为utf串),字符型不能被映射到data step中,且不能由java class返回对象到data step中(string对象除外),但是容许传送对象到java class中
某些java类返回对象,我们可以封装改类以获得对象的值,例如
| import java.util.*; public class mhash public mhash() public void put(double key, double value) public void put(string key, string value) public double get(double key) public string get(string key) |
data step中使用
| data _null_; length s $20; /* |
| /* load up the table */ h.callvoidmethod("put", "key1", "data1"); h.callvoidmethod("put", "key2", "data2"); h.callvoidmethod("put", "key3", "data3"); h.callvoidmethod("put", "key4", "data4"); h.callvoidmethod("put", "key5", "data5"); /* retrieve a value */ |
数组使用
| data step数组能直接传到java对象中,如 import java.util.*; import java.lang.*; class jtest { public void dbl(double args[]) { for(int i = 0; i < args.length; i++) system.out.println(args[i]); } public void str(string args[]) data _null_; |
闽公网安备 35060202000074号