Adding members to another type doesn't violate encapsulation. Existing clients of that type continue to use the type as if it isn't modified. Only aspects (and other parts) that are aware of the introduced members utilize the type to provide additional functionality. As for access, by default aspects use the same access rules as Java. Specifically, aspects do not have access to private members of another type. AspectJ does have privileged aspects that can give access to private members, but its use should be (and usually is) limited to corner cases.