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

来源:互联网 发布:日本修改宪法 知乎 编辑:程序博客网 时间:2024/06/06 09:39


简介
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;

 

 


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩老是流黄鼻涕口臭怎么办 狗狗有食欲流黄鼻涕拉稀怎么办 小孩流黄鼻涕咳嗽怎么办 小狗感冒了一直打喷嚏怎么办 眼干眼屎多模糊怎么办 宝宝眼睛上火眼屎多怎么办 眼睛发干眼屎多怎么办 三个月宝宝眼睛流泪有眼屎怎么办 小孩眼睛流泪有眼屎怎么办 宝宝上火眼睛有好多眼屎怎么办 宝宝眼睛流泪还有眼屎怎么办? 新生儿眼睛上火眼屎多怎么办 铁耳屎在最里面怎么办 婴儿鼻屎特别深怎么办 鼻子干呼吸就疼怎么办 儿童鼻子里总有好多鼻屎怎么办 小孩鼻子里有鼻屎呼吸不通怎么办 鼻子不通通气鼻屎粘在鼻子怎么办 鼻子里面干燥长鼻屎怎么办 鼻孔里干的难受怎么办 每天有很多鼻屎怎么办 鼻子里面干的疼怎么办 婴儿鼻屎堵住了怎么办 婴儿有很多鼻屎怎么办 隆鼻7天好多鼻屎怎么办 隆鼻第五天好多鼻屎怎么办 小孩鼻屎堵住了怎么办 风寒感冒流清鼻涕怎么办 流清鼻涕吐黄痰不发烧怎么办 宝宝流黄鼻涕发烧怎么办 感冒了浓鼻涕多怎么办 感冒流浓鼻涕怎么办速效办法 孩子一直流清水鼻涕怎么办 宝宝鼻子呼噜呼噜响怎么办 鼻涕往嗓子里流怎么办 咳嗽痰多鼻涕多怎么办 没感冒嗓子痰多鼻涕怎么办 孩子感冒后鼻涕特别多怎么办 经常有鼻涕怎么办才好 怀孕后鼻涕痰多怎么办 鼻炎有鼻涕痰多怎么办