A General Framework for Constraint-Based Static Analyses of Java Bytecode Programs