package test.stackmaptable;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
// https://github.com/bndtools/bnd/issues/1776
public class ClassRefInStackMapTable {
public static void main(String[] args) {
/*
* Create an object and assign it to a super-type variable. Note the
* super-type is in a different package from the concrete type.
*/
SecretKey key = new SecretKeySpec(new byte[] {
0
}, "NULL");
/*
* This branch causes the compiler to emit a StackMapTable in the byte
* code. The table will refer to the local 'key' and force a reference
* to the 'SecretKey' class to appear in the constant pool (which would
* not be required without the StackMapTable). Bnd sees the 'SecretKey'
* class in the constant pool but assumes its an orphan because it has
* no associated entries that refer to it. When it double checks by
* crawling the byte code the StackMapTable is ignored. Bnd decides that
* 'SecretKey' is an orphan and does not emit and Import-Package
* directive for its package. This causes a NoClassDefFoundError at
* runtime.
*/
if (System.currentTimeMillis() > 0) {
System.out.println("Toast!");
}
System.out.println(key);
}
}