The specification language is a critical component of the hardware-software cc-design process since it is used for functional validation and as a starting point for hardware-software partitioning and Eo-synthesis. This paper proposes the Java programming language as a specification language for hardware-software systems. Java has ser emf characteristics that make it suitable for system specification. However, static control and dataflow analysis of Java programs is problematic because Java classes are dynamically linked. This paper provides a general solution to the problem of statically analyzing Java programs using a technique that pre-allocates most class instances and aggressively resolves memory aliasing using global analysis. The output of our analysis is a control dataflow graph for the input specification. Our results for sample designs show that the analysis can extract fine to coarse-grained concurrency far subsequent hardware-software partitioning and co-synthesis steps of the hardware-software codesign process to exploit.