龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

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

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
简介:DSCI提供建立和处理组件对象在DATA STEP程序中,JavaOBJ就是这样的一个对象,其提供类似JNI的机制,可实例化JAVA类,访问对象属性和方法 定义JAVA对象 其由DECLARE语法支持: declare
  简介: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);

  访问类的属性和方法
  
  

精彩图集

赞助商链接