309 return System.identityHashCode(this); 310 } 311 312 public List<ModuleReference> allModules() { 313 validateVM(); 314 List<ModuleReference> modules = retrieveAllModules(); 315 return Collections.unmodifiableList(modules); 316 } 317 318 List<ReferenceType> classesBySignature(String signature) { 319 validateVM(); 320 List<ReferenceType> list; 321 if (retrievedAllTypes) { 322 list = findReferenceTypes(signature); 323 } else { 324 list = retrieveClassesBySignature(signature); 325 } 326 return Collections.unmodifiableList(list); 327 } 328 329 public List<ReferenceType> classesByName(String className) { 330 validateVM(); 331 String signature = JNITypeParser.typeNameToSignature(className); 332 List<ReferenceType> list; 333 if (retrievedAllTypes) { 334 list = findReferenceTypes(signature); 335 } else { 336 list = retrieveClassesBySignature(signature); 337 } 338 return Collections.unmodifiableList(list); 339 } 340 341 public List<ReferenceType> allClasses() { 342 validateVM(); 343 344 if (!retrievedAllTypes) { 345 retrieveAllClasses(); 346 } 347 ArrayList<ReferenceType> a; 348 synchronized (this) { 349 a = new ArrayList<>(typesBySignature); 350 } 351 return Collections.unmodifiableList(a); 352 } 353 354 /** 355 * Performs an action for each loaded type. 356 */ 357 public void forEachClass(Consumer<ReferenceType> action) { | 309 return System.identityHashCode(this); 310 } 311 312 public List<ModuleReference> allModules() { 313 validateVM(); 314 List<ModuleReference> modules = retrieveAllModules(); 315 return Collections.unmodifiableList(modules); 316 } 317 318 List<ReferenceType> classesBySignature(String signature) { 319 validateVM(); 320 List<ReferenceType> list; 321 if (retrievedAllTypes) { 322 list = findReferenceTypes(signature); 323 } else { 324 list = retrieveClassesBySignature(signature); 325 } 326 return Collections.unmodifiableList(list); 327 } 328 329 private static boolean isReferenceArray(String signature) { 330 int i = signature.lastIndexOf('['); 331 if (i > -1 && signature.charAt(i+1) == 'L') { 332 return true; 333 } 334 return false; 335 } 336 337 public List<ReferenceType> classesByName(String className) { 338 validateVM(); 339 String signature = JNITypeParser.typeNameToSignature(className); 340 List<ReferenceType> list; 341 if (retrievedAllTypes) { 342 list = findReferenceTypes(signature); 343 } else { 344 list = retrieveClassesBySignature(signature); 345 } 346 // HACK: add second request to cover the case where className 347 // is the name of an inline type. This is done only if the 348 // first signature is either a reference type or an array 349 // of a reference type. 350 if (signature.length() > 1 && 351 (signature.charAt(0) == 'L' || isReferenceArray((signature)))) { 352 List<ReferenceType> listInlineTypes; 353 signature = JNITypeParser.inlineTypeNameToSignature(className); 354 if (retrievedAllTypes) { 355 listInlineTypes = findReferenceTypes(signature); 356 } else { 357 listInlineTypes = retrieveClassesBySignature(signature); 358 } 359 if (!listInlineTypes.isEmpty()) { 360 list.addAll(listInlineTypes); 361 } 362 } 363 364 return Collections.unmodifiableList(list); 365 } 366 367 public List<ReferenceType> allClasses() { 368 validateVM(); 369 370 if (!retrievedAllTypes) { 371 retrieveAllClasses(); 372 } 373 ArrayList<ReferenceType> a; 374 synchronized (this) { 375 a = new ArrayList<>(typesBySignature); 376 } 377 return Collections.unmodifiableList(a); 378 } 379 380 /** 381 * Performs an action for each loaded type. 382 */ 383 public void forEachClass(Consumer<ReferenceType> action) { |