depend module

This module provides functions to check class files (constant pool) and see the dependency to other classes/methods/fields.

Functions

listClassRef( String fileName)
( File file )
( InputStream inputStream )
( URL resource )

listClassRef() returns a java.util.Set object of all classes referenced by the specified class, class file, or JAR file.

listClassRef(Exception)
     ==> [java.lang.Exception, java.lang.String, java.lang.Throwable]

listClassRef(getResource("java/io/IOException.class"))
     ==> [java.io.IOException, java.lang.Exception, java.lang.String]

listClassRef("Hello.class")
     ==> [Hello, java.io.PrintStream, java.lang.Object, java.lang.String, java.lang.System]

listClassRef("depend.jar")
     ==> [depend.init, java.lang.Object, java.lang.String, pnuts.ext.ModuleBase, pnuts.lang.Context]

A Practical Example

use("depend")

function checkDependency(inputs, target){
  function toClassName(name) name[0..size(name)-7].replace('/', '.')
  classes = set()
  targetIncluded = false
  for (j: inputs){
    if (j == target) targetIncluded = true
    readZip(j, function (e, in){
      name = e.name
      if (name.endsWith(".class")) classes.add(toClassName(name))
    })
  }
  if (!targetIncluded){
    readZip(target, function (e, in){
      name = e.name
      if (name.endsWith(".class")) classes.add(toClassName(name))
    })
  }
  badentry = map()
  readZip(target, function (e, in){
    name = e.name
    if (name.endsWith(".class")){
       url = getURL("jar:file:" + jarfile + "!/" + name)
       classname = toClassName(name)
       for (i: listClassRef(url)) if (!contains(classes, i)) badentry.put(classname, i)
    }
  })
  badentry
}

jarfile = "pnuts-j2me_cdc.jar"
pp = ["btclasses.zip","personal.jar"]
mapFunction(function (k, v) println(k, ": ", v, " is missing"), checkDependency(pp, jarfile))
listMethodRef( String fileName)
( File file )
( InputStream inputStream )
( URL resource )

listMethodRef() returns a java.util.Set object of all method signatures referenced by the specified class, class file, or JAR file.

> printAll(listMethodRef(Exception))
java.lang.Throwable#()V
java.lang.Throwable#(Ljava/lang/String;)V
java.lang.Throwable#(Ljava/lang/String;Ljava/lang/Throwable;)V
java.lang.Throwable#(Ljava/lang/Throwable;)V
listFieldRef( String fileName)
( File file )
( InputStream inputStream )
( URL resource )

listFieldRef() returns a java.util.Set object of all field signatures referenced by the specified class, class file, or JAR file.

> printAll(listFieldRef(class java.io.FileInputStream))
java.io.FileDescriptor#in(Ljava/io/FileDescriptor;)
java.io.FileInputStream#channel(Ljava/nio/channels/FileChannel;)
java.io.FileInputStream#fd(Ljava/io/FileDescriptor;)