服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

sas9新体验:在data step中使用java对象

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




扫描关注微信公众号