Age in years at a specific date
In Java 8 you can more accurately represent the dateOfBirth with a LocalDate.
If the ageAt() method also takes a LocalDate as argument, then the age is easily computed using Period.

public int ageAt(LocalDate ageReferenceDate) {
    return Period.between(dateOfBirth, ageReferenceDate).getYears();
}


It is fairly easy, albeit a bit verbose, to convert a Date instance to a LocalDate :

LocalDate localDate = ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();


The catch is that you need to interpret it vs. a ZoneId. A Date can be mapped to different LocalDates depending on what ZoneId (TimeZone's successor) it is evaluated against. You should use the ZoneId that was used when the Date was recorded. That is probably ZoneId.systemDefault(), but if your code can run on systems accross time zones, you can have a problem.

This is also the reason why it is a better idea to represent date of birth as a LocalDate, since it does away with that ambiguity.