How to import .jar with JPF?

319 views
Skip to first unread message

Zhenyu Zhou

unread,
Nov 19, 2015, 2:37:54 PM11/19/15
to Java™ Pathfinder
Hello,

I want to run JPF on a project importing some .jar libraries. However, I always met ClassNotFoundException. Tracing back the exception by line number, I find it's the place that the external class appears for the first time.

So I'm wondering how can I import the .jar library? I'm using the latest version of jpf-core and jpf-symbc and I can run the example symbolic execution (SE) successfully. I have tried to put the .jar file at jpf-symbc/lib but that doesn't work. I compile the code with ant and set debug=true for javac.

Below is the error msg I got:
~/jpf/jpf-symbc$ ../jpf-core/bin/jpf /home/zzy/jpf/floodlight/src/main/java/net/floodlightcontroller/hub/Hub.jpf
Running Symbolic PathFinder ...
symbolic.dp=choco
symbolic.string_dp_timeout_ms=0
symbolic.string_dp=none
symbolic.choco_time_bound=30000
symbolic.max_pc_length=2147483647
symbolic.max_pc_msec=0
symbolic.min_int=-1000000
symbolic.max_int=1000000
symbolic.min_double=-8.0
symbolic.max_double=7.0
JavaPathfinder core system v8.0 (rev 29) - (C) 2005-2014 United States Government. All rights reserved.
====================================================== system under test
net.floodlightcontroller.hub.Hub.main()

====================================================== search started: 11/19/15 2:23 PM

====================================================== error 1
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.ClassNotFoundException: class not found: org.slf4j.LoggerFactory
    at net.floodlightcontroller.hub.Hub.<clinit>(Hub.java:51)


====================================================== snapshot #1
thread java.lang.Thread:{id:0,name:main,status:RUNNING,priority:5,isDaemon:false,lockCount:0,suspendCount:0}
  owned locks:java.lang.Class@b3
  call stack:
    at net.floodlightcontroller.hub.Hub.<clinit>(Hub.java:51)


====================================================== Method Summaries

====================================================== Method Summaries (HTML)

====================================================== results
error #1: gov.nasa.jpf.vm.NoUncaughtExceptionsProperty "java.lang.ClassNotFoundException: class not found:..."

====================================================== statistics
elapsed time:       00:00:01
states:             new=1,visited=0,backtracked=1,end=0
search:             maxDepth=1,constraints=0
choice generators:  thread=1 (signal=0,lock=1,sharedRef=0,threadApi=0,reschedule=0), data=0
heap:               new=371,released=0,maxLive=0,gcCycles=0
instructions:       3100
max memory:         30MB
loaded code:        classes=67,methods=1328


Thanks in advance!

Zhenyu

Kasper Søe Luckow

unread,
Nov 19, 2015, 2:47:30 PM11/19/15
to java-pa...@googlegroups.com
Hi,

I'm not sure I understand your question, but my interpretation is that you would like to symbolically execute an application that references class files located in a jar (which I assume to be slf4j). If that is the case:
In your jpf file (presumably Hub.jpf?), you should update the classpath variable to also include the path to the jar. The classpath variable should match the classpath you would normally use to run your application on your host jvm.
To give you an idea, you should have something like:
classpath=/path/to/your/analyzed/application;/path/to/referenced/jar

Kasper

--

---
You received this message because you are subscribed to the Google Groups "Java™ Pathfinder" group.
To unsubscribe from this group and stop receiving emails from it, send an email to java-pathfind...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Zhenyu Zhou

unread,
Nov 19, 2015, 3:10:20 PM11/19/15
to Java™ Pathfinder
Hi Kasper,

Your understanding is definitely correct. However, the problem still exist after adding the path to .jar library.

Attachments are my files and their location is:
/home/zzy/jpf/floodlight/src/main/java/net/floodlightcontroller/hub/Hub.java
/home/zzy/jpf/floodlight/src/main/java/net/floodlightcontroller/hub/Hub.jpf (I think the classpath for Hub.class shouldn't contain the folders after bin/. If I add the additional folders after bin, JPF will report it cannot load Hub.class.)

And the class files are at:
/home/zzy/jpf/floodlight/target/bin/net/floodlightcontroller/hub/Hub.class
/home/zzy/jpf/floodlight/target/floodlight.jar

I'm sure the class slf4j.* is included in the .jar file by checking it with "jar tf".

Do I miss anything here? Thanks!
Hub.java
Hub.jpf

Kasper Søe Luckow

unread,
Nov 19, 2015, 3:19:58 PM11/19/15
to java-pa...@googlegroups.com
You should update the classpath to
classpath=/home/zzy/jpf/floodlight/target/bin/;/home/zzy/jpf/floodlight/target/floodlight.jar

It looks a little bit weird though. Is Hub.class not included in floodlight.jar? If so, you should be careful which class file of Hub is actually being loaded.

Kasper

Zhenyu Zhou

unread,
Nov 19, 2015, 3:28:58 PM11/19/15
to Java™ Pathfinder
I see... floodlight.jar indeed include Hub.class as well. But it should be the same with the Hub.class I need because the jar is just a bundle for these class, either is OK for my purpose.

After I update the class path as you suggest, the error msg changes (which means the library is loaded!):

====================================================== system under test
net.floodlightcontroller.hub.Hub.main()

====================================================== search started: 11/19/15 3:25 PM
[SEVERE] JPF exception, terminating: exception during instructionExecuted() notification
java.lang.AssertionError: can't find caller stackframe for: invokevirtual java.lang.String.length()I
    at gov.nasa.jpf.jvm.bytecode.JVMInvokeInstruction.getArgumentValues(JVMInvokeInstruction.java:167)
    at gov.nasa.jpf.symbc.SymbolicListener.instructionExecuted(SymbolicListener.java:189)
    at gov.nasa.jpf.vm.VM.notifyInstructionExecuted(VM.java:808)
    at gov.nasa.jpf.vm.ThreadInfo.executeInstruction(ThreadInfo.java:1922)
    at gov.nasa.jpf.vm.ThreadInfo.executeTransition(ThreadInfo.java:1859)
    at gov.nasa.jpf.vm.SystemState.executeNextTransition(SystemState.java:765)
    at gov.nasa.jpf.vm.VM.forward(VM.java:1722)
    at gov.nasa.jpf.search.Search.forward(Search.java:579)
    at gov.nasa.jpf.search.DFSearch.search(DFSearch.java:79)
    at gov.nasa.jpf.JPF.run(JPF.java:613)
    at gov.nasa.jpf.JPF.start(JPF.java:189)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at gov.nasa.jpf.tool.Run.call(Run.java:80)
    at gov.nasa.jpf.tool.RunJPF.main(RunJPF.java:116)
---------------------- JPF error stack trace ---------------------
gov.nasa.jpf.JPFListenerException: exception during instructionExecuted() notification
    at gov.nasa.jpf.vm.VM.notifyInstructionExecuted(VM.java:815)
    at gov.nasa.jpf.vm.ThreadInfo.executeInstruction(ThreadInfo.java:1922)
    at gov.nasa.jpf.vm.ThreadInfo.executeTransition(ThreadInfo.java:1859)
    at gov.nasa.jpf.vm.SystemState.executeNextTransition(SystemState.java:765)
    at gov.nasa.jpf.vm.VM.forward(VM.java:1722)
    at gov.nasa.jpf.search.Search.forward(Search.java:579)
    at gov.nasa.jpf.search.DFSearch.search(DFSearch.java:79)
    at gov.nasa.jpf.JPF.run(JPF.java:613)
    at gov.nasa.jpf.JPF.start(JPF.java:189)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at gov.nasa.jpf.tool.Run.call(Run.java:80)
    at gov.nasa.jpf.tool.RunJPF.main(RunJPF.java:116)
Caused by: java.lang.AssertionError: can't find caller stackframe for: invokevirtual java.lang.String.length()I
    at gov.nasa.jpf.jvm.bytecode.JVMInvokeInstruction.getArgumentValues(JVMInvokeInstruction.java:167)
    at gov.nasa.jpf.symbc.SymbolicListener.instructionExecuted(SymbolicListener.java:189)
    at gov.nasa.jpf.vm.VM.notifyInstructionExecuted(VM.java:808)
    ... 14 more

Do you have any insight of this exception? It seems that JPF fails to instrument String.

One more thing may be important here: Hub.java didn't have main() originally. I add an empty main because JPF complains that a static main() cannot be found. I'm not sure whether this matters or not.

Kasper Søe Luckow

unread,
Nov 19, 2015, 4:42:46 PM11/19/15
to java-pa...@googlegroups.com
I think you should read generally about what JPF and jpf-symbc really are and how the general configuration works. Check the developer guide at http://babelfish.arc.nasa.gov/trac/jpf
I'm not sure what your setup is at the moment, but your entry point (i.e. the target variable in your jpf conf) must contain a main() method.

You shouldn't have a classpath with multiple entries from which the "same" class can be loaded. I would advice you to keep only the jar on the classpath

Zhenyu Zhou

unread,
Nov 19, 2015, 5:01:00 PM11/19/15
to Java™ Pathfinder
Thanks for your reply! I'll read the wiki again to see if I miss anything for the configuration.

Kasper Søe Luckow

unread,
Nov 19, 2015, 5:12:55 PM11/19/15
to java-pa...@googlegroups.com
Feel free to ask :)
It's likely I can help you, but I need to understand better what you would like to achieve, e.g., what is your target application, and which method(s) would you like to symbolically execute? What should the end result be? Do you know what kinds of constraints you have -- i.e. are they numeric or strings?

Kasper

Zhenyu Zhou

unread,
Nov 19, 2015, 5:31:13 PM11/19/15
to Java™ Pathfinder
Thank you! My ultimate goal is to run symbolic execution on complex applications. In this example, my aim function is receive() of class Hub. All my applications may have such receive() function while the one in Hub is the simplest one. The expected result should be whether there are any problematic corner cases in this receive() function. I guess the main constrains may be Null pointers, arithmetic exceptions or buffer overflow (not sure whether the last one can be detected by SE). 

In Hub, there is no such complex operations, so that's why i feel confused about why I got the exception related to String.length() while instructing.

Zhenyu Zhou

unread,
Nov 24, 2015, 9:20:21 PM11/24/15
to Java™ Pathfinder
Hello again,

I finally find the exact statement that causes the exception: 
protected static Logger log = LoggerFactory.getLogger(net.floodlightcontroller.hub.Hub.class);

For your reference, the exception is (also found in my previous post):
[SEVERE] JPF exception, terminating: exception during instructionExecuted() notification
java.lang.AssertionError: can't find caller stackframe for: invokevirtual java.lang.String.length()I
    at gov.nasa.jpf.jvm.bytecode.JVMInvokeInstruction.getArgumentValues(JVMInvokeInstruction.java:167)
    ...

The class Loger is imported as
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

It should be a widely used logger tool. Do you have any idea why I met the exception here and how to solve it? 

Thanks!

Kasper Søe Luckow

unread,
Nov 24, 2015, 10:41:21 PM11/24/15
to java-pa...@googlegroups.com
Do you have symbolic string variables? This is currently under improvement.

Kasper

Zhenyu Zhou

unread,
Nov 24, 2015, 10:47:23 PM11/24/15
to Java™ Pathfinder
No. The target function now is:
public void startUp(FloodlightModuleContext context) {} // do nothing

which is an empty function and its parameter is not String.

In Hub.jpf:
symbolic.method= net.floodlightcontroller.hub.Hub.startUp(sym)

If I comment the statement in my last post, ie. "protected static Logger log = LoggerFactory.getLogger(net.floodlightcontroller.hub.Hub.class);", everything goes well. But as long as I add this statement, I got the exception. That's why I regard it as the root cause.

Do I miss anything here? I indeed don't find String here...

Kasper Søe Luckow

unread,
Nov 24, 2015, 11:13:39 PM11/24/15
to java-pa...@googlegroups.com
The exception is thrown in jpf-core when trying to obtain the argument values for an invokevirtual bytecode on java.lang.String.length -- right now, I'm not sure why that happens. However, this is something pertaining to your use of SymbolicListener -- if you don't use it, my guess would be that it works fine.

One important thing:
You shouldn't have an empty target method. If the symbolic input is not used anywhere, no constraints are built and you are essentially executing the program concretely; not symbolically. In general, that does not make sense while it could work if you are explicitly injecting symbolic variables elsewhere with some of the methods Debug.makeSymbolic*(). Is that the case?
The purpose of a target method (you can have more than one) is essentially to specify where symbolic variables are introduced (through the parameters).

Hope this helps.

Kasper

Zhenyu Zhou

unread,
Nov 25, 2015, 12:22:41 AM11/25/15
to Java™ Pathfinder
I see. You are right I didn't inject the symbolic variable anywhere (because the module is actually event driven and I won't call the method explicitly). However, my ultimate goal is symbolic execution so that I may have to use SymbolicListener (correct?). And it is still the Logger statement that causes the exception. But anyway, I put it as "protected static Logger log = null" and I never meet the exception now. This should have no effects to SE fortunately. The String.length() exception must be thrown from this statement.

Following your suggestion, now I turned to a practical method, say, receive(), which has full implementation codes and all its parameters are used inside itself. I called receive inside main() in order to somehow provide an entrance for it (correct?).
The main structure is:
public class Hub implements IFloodlightModule, IOFMessageListener {
    protected static Logger log = null;
    ...
    public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {
                  .....   // uses all parameters here
    }
    public static void main(String[] args)
    {
          System.out.println("zzyzzy: in hub main");
  new Hub().receive(null, null, null); // only for a test entry
    }
}

I changed the configuration in Hub.jpf to:
symbolic.method= edu.duke.cs.legosdn.tests.apps.hub.Hub.receive(sym#sym#sym)

And I got such output without exception from JPF:

Running Symbolic PathFinder ...
symbolic.dp=choco
symbolic.string_dp_timeout_ms=0
symbolic.string_dp=none
symbolic.choco_time_bound=30000
symbolic.max_pc_length=2147483647
symbolic.max_pc_msec=0
symbolic.min_int=-1000000
symbolic.max_int=1000000
symbolic.min_double=-8.0
symbolic.max_double=7.0
JavaPathfinder core system v8.0 (rev 29) - (C) 2005-2014 United States Government. All rights reserved.


====================================================== system under test
edu.duke.cs.legosdn.tests.apps.hub.Hub.main()

====================================================== search started: 11/25/15 12:15 AM
zzyzzy: in hub main

====================================================== error 1
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.NoSuchMethodError: ?UNKNOWN?.getBufferId()I
at edu.duke.cs.legosdn.tests.apps.hub.Hub.receive(Hub.java:66)
at edu.duke.cs.legosdn.tests.apps.hub.Hub.main(Hub.java:143)


====================================================== snapshot #1
thread java.lang.Thread:{id:0,name:main,status:RUNNING,priority:5,isDaemon:false,lockCount:0,suspendCount:0}
  call stack:
at edu.duke.cs.legosdn.tests.apps.hub.Hub.receive(Hub.java:66)
at edu.duke.cs.legosdn.tests.apps.hub.Hub.main(Hub.java:143)


====================================================== Method Summaries
Inputs: sw_CONCRETE,,msg_CONCRETE,,cntx_CONCRETE,
No path conditions for edu.duke.cs.legosdn.tests.apps.hub.Hub.receive(null,null,null)

====================================================== Method Summaries (HTML)
<h1>Test Cases Generated by Symbolic JavaPath Finder for edu.duke.cs.legosdn.tests.apps.hub.Hub.receive (Path Coverage) </h1>
No path conditions for edu.duke.cs.legosdn.tests.apps.hub.Hub.receive(null,null,null)

====================================================== results
error #1: gov.nasa.jpf.vm.NoUncaughtExceptionsProperty "java.lang.NoSuchMethodError: ?UNKNOWN?.getBufferId..."

Do you have any idea what this result stands for? Why I got "java.lang.NoSuchMethodError" here? The code is compilable so I believe receive is indeed a method in this file. Also, does "No path conditions for ...." means symbolic execution still fails in this case?

Thanks a ton for your patience and kind help!

Zhenyu

Quoc-Sang Phan

unread,
Nov 28, 2015, 7:18:11 PM11/28/15
to Java™ Pathfinder
The method "receive" invoked the method getBufferId, which Java couldn't find.
Did you just add this method to a class, and forgot to re-compile that class?
--Sang

Zhenyu Zhou

unread,
Nov 28, 2015, 11:32:14 PM11/28/15
to Java™ Pathfinder
Hello Phan,

I find the method is there, but my entry in main() is receive(null, null, null), which makes getBufferId is invoked by null. I guess that's the problem because once I initiate the variable, this problem goes.

But not all variables can be initiated successfully. For example, the first parameter for receive() is IOFSwitch, which is abstract. If I initiate it with OFSwitchImpl, which is the subclass of IOFSwtich, JPF will report errors as before:

[SEVERE] JPF exception, terminating: exception during instructionExecuted() notification
java.lang.AssertionError: can't find caller stackframe for: invokevirtual java.lang.String.length()I
    at gov.nasa.jpf.jvm.bytecode.JVMInvokeInstruction.getArgumentValues(JVMInvokeInstruction.java:167)
    at gov.nasa.jpf.symbc.heap.HeapSymbolicListener.instructionExecuted(HeapSymbolicListener.java:429)
...

I attached my files: now it works. But if I uncommented Line 144 and 146, commented L147 in Hub.java, the exception above occurs. Do I miss anything here (maybe for class hierarchy?)

And another question is, JPF always stops when it find an error. That means I have to somehow fix the given error so that the test can continue and find more errors after the first one. Are there any ways to make the test one-time run?  I have set "search.multiple_errors=true" in Hub.jpf but it seems to not work...

Thank you!

Zhenyu
Hub.java
Hub.jpf

Quoc-Sang Phan

unread,
Nov 29, 2015, 2:37:06 AM11/29/15
to Java™ Pathfinder
Hi,

Since the method "receive" take reference types as arguments, you need to turn on lazy initialization: symbolic.lazy (and perhaps symbolic.lazy.subtypes).

Your setting, "search.multiple_errors=true", is correct. However, you need to distinguish two types of errors: 1) errors in your program only 2) errors in your program that caused error in JPF.

Type 1 error includes: null pointer, array index out of bound, assertion violation and so on. With the setting above, JPF can execute the program and search for multiple error. However, your error fell into the type 2: JPF was unable to find the method or it failed to execute bytecode instructions etc... this type of error makes JPF stop immediately.

Best wishes,
--Sang

Zhenyu Zhou

unread,
Nov 29, 2015, 3:32:15 PM11/29/15
to Java™ Pathfinder
Thanks for the reply! I turned on both symbolic.lazy and symbolic.lazy.subtypes now but it still doesn't work:

No matter I turned on these two options or not, as long as I uncommented "IOFSwitch sw =  new OFSwitchImpl();", I will get the exception with String.length in my past post.

Therefore i assume the entry in main() should be receive(null, null, null) (is it correct? I've found such entry with null in the jpf example codes). And if I uncommented the block:
        try {
            sw.write(po, cntx);
        } catch (IOException e) {
                System.out.println("in catch");
        }
where sw is the first parameter of receive, I'll get a new exception as:
java.lang.NullPointerException
at gov.nasa.jpf.vm.GenericHeap.queueMark(GenericHeap.java:557)
at gov.nasa.jpf.vm.GenericHeap.markThreadRoot(GenericHeap.java:583)
at gov.nasa.jpf.vm.StackFrame.markThreadRoots(StackFrame.java:1765)
at gov.nasa.jpf.vm.ThreadInfo.markRoots(ThreadInfo.java:2595)
at gov.nasa.jpf.vm.ThreadList.markRoots(ThreadList.java:297)
at gov.nasa.jpf.vm.GenericHeap.mark(GenericHeap.java:641)
at gov.nasa.jpf.vm.GenericHeap.gc(GenericHeap.java:655)
at gov.nasa.jpf.vm.KernelState.gc(KernelState.java:163)
at gov.nasa.jpf.vm.SystemState.gcIfNeeded(SystemState.java:675)
at gov.nasa.jpf.vm.VM.forward(VM.java:1738)
at gov.nasa.jpf.search.Search.forward(Search.java:579)
at gov.nasa.jpf.search.DFSearch.search(DFSearch.java:79)
at gov.nasa.jpf.JPF.run(JPF.java:613)
at gov.nasa.jpf.JPF.start(JPF.java:189)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at gov.nasa.jpf.tool.Run.call(Run.java:80)
at gov.nasa.jpf.tool.RunJPF.main(RunJPF.java:116)

and JPF terminates because of this exception. Without this block, JPF works well.

Do I miss anything here? I'm wondering what may cause such exception, the null parameter sw, the try block, or anything else?

Thanks again for your help!

Zhenyu

Teodoro Filippini

unread,
May 27, 2016, 9:21:11 AM5/27/16
to Java™ Pathfinder
Did you by any chance manage to get this working? I'm facing the same problem: I have a library in a jar file, and when running SPF on my class, I get:

 [SEVERE] JPF exception, terminating: exception during instructionExecuted() notification

java.lang.NullPointerException

at gov.nasa.jpf.jvm.bytecode.JVMInvokeInstruction.getArgumentValues(JVMInvokeInstruction.java:168)

at gov.nasa.jpf.symbc.SymbolicListener.instructionExecuted(SymbolicListener.java:185)

at gov.nasa.jpf.vm.VM.notifyInstructionExecuted(VM.java:808)

at gov.nasa.jpf.vm.ThreadInfo.executeInstruction(ThreadInfo.java:1922)

at gov.nasa.jpf.vm.ThreadInfo.executeTransition(ThreadInfo.java:1859)

at gov.nasa.jpf.vm.SystemState.executeNextTransition(SystemState.java:765)

at gov.nasa.jpf.vm.VM.forward(VM.java:1722)

at gov.nasa.jpf.search.Search.forward(Search.java:579)

Zhenyu Zhou

unread,
May 27, 2016, 9:50:17 AM5/27/16
to Java™ Pathfinder
Hello Teodoro,

I suspect JPF could not deal with the class hierarchy in my case and that exception happens when I pass the parameter with the type as the subclass of the parameter type of method signature. Also, it may NOT be recommended to pass the parameter in the static entry (within main()) as null or 0.

My temporary solution is to make a fake method and to remove such hierarchy issues. Then I can obtain the execution path tree as expected.

Hope this helps.

Thanks!

Zhenyu

Teodoro Filippini

unread,
Jun 1, 2016, 8:34:45 AM6/1/16
to Java™ Pathfinder
Dear Zhenyu,

thank you for your answer. If I "flatten" the inherited classes into a single blob class, SPF actually works; but is that really the only way? The application I'm supposed to check has a huge number of inherited classes... And I can't believe SPF doesn't support such a fundamental part of Java programs...

Best,
Teodoro

Zhenyu Zhou

unread,
Jun 1, 2016, 2:44:06 PM6/1/16
to Java™ Pathfinder
Hi Teodoro,

Sorry I have to say that I also can't believe that.... But I indeed don't find better solutions yet. My recommendation is to make fake interfaces, rather than actual implementation for the parts you doesn't care about, to avoid too deep "flatten". So if you can find any other solutions later, please let me know as well.

Thanks!

Zhenyu

Teodoro Filippini

unread,
Jun 2, 2016, 4:59:02 AM6/2/16
to Java™ Pathfinder
It's weird, because it works on all miniature examples with inheritance I'm writing.... I'll keep you posted if I find out why it fails on more complex situations.

Best
Teodoro

Zhenyu Zhou

unread,
Jun 2, 2016, 10:09:59 AM6/2/16
to Java™ Pathfinder
Thanks! Yes it's same for me - it works well for the simple test cases I created as well, even if inheritance exists. I indeed don't know the actual root cause while I only know "flatten" or fake interfaces could be a makeshift.

Zhenyu
Reply all
Reply to author
Forward
0 new messages