Operations, Statements, and Dependency
We assume that frameworks and their applications are implemented in Java language. Java objects consist of class instances and arrays. Operations on objects are method invocations (except for static methods), and accesses to their instance variables or array components. An operation is expressed as a statement or an expression in a statement.
Parameters of a method invocation consist of its receiver (if any) and arguments. We call instance variables and array components persistent variables. When a persistent variable of an object is accessed to assign or get a value, then we say that the object is used as a carrier of the value, and that the object carries the value.
In addition to ordinary dependency among statements (Tip, 1995), we introduce new kinds of dependency among operations and statements. A get operation on a persistent variable depends on the operation that assigned the got value to the persistent variable. A method invocation whose receiver is not null executes the method body bound at runtime based on the receiver class. Thus method receivers work in a similar way to operands of conditional branching statements.
A value carrier itself may have been carried by another object, which is the carrier of the carrier of the value. We may further get the carrier of the carrier of the carrier of the value. For a carried value, we can thus obtain a sequence of references of persistent variables which have brought the value. We call such a sequence a reference path to the value or its carrier.