分享
 
 
 

SAS9新体验-在DATA STEP中使用JAVA对象

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

简介

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

{

mhash(double size, double load)

{

super((int)size, (float)load);

}

}

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);

put val=;

j.getDoubleField("d", val);

put val=;

j.getStringField("s", str);

put str=;

run;

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()

{

return i;

}

public String sm()

{

return s;

}

public double dm()

{

return d;

}

}

我们可以通过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);

j.callStaticDoubleMethod("dm", d);

put d=;

run;

数据类型使用

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

{

private Hashtable table;

public mhash()

{

table = new Hashtable();

}

public void put(double key, double value)

{

table.put(new Double(key), new Double(value));

}

public void put(String key, String value)

{

table.put(key, value);

}

public double get(double key)

{

Object ret = table.get(new Double(key));

if (ret instanceof Double)

return ((Double)ret).doubleValue();

else

return Double.NaN;

}

public String get(String key)

{

return (String)table.get(key);

}

}

data step中使用

data _null_;

length s $20;

/*

* Simple Java hash table test. mhash.class is a wrapper

* for java/util/Hashtable - so that we can pass Java strings

* directly instead of generic Objects.

*/

declare javaobj h("mhash");

/* 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 */

h.callStringMethod("get", "key3", s);

put s=;

run;

数组使用

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[])

{

for(int i = 0; i < args.length; i++)

System.out.println(args[i]);

}

}

data _null_;

dcl javaobj j("jtest");

array s[3] $20 ("abc", "def", "ghi");

array d[10] (1:10);

j.callVoidMethod("dbl", d);

j.callVoidMethod("str", s);

run;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有