src/main/java/org/eiichiro/reverb/lang/ClassResolver.java
public Set<T> resolve(Matcher<T> matcher) throws IOException {
		Set<T> classes = new HashSet<T>();
		
		for (URL url : paths) {
			if (url.toString().endsWith(".jar")) {
//				System.out.println(url);
				JarFile jarFile = new JarFile(URLDecoder.decode(url.getPath(), "UTF-8"));
				Manifest manifest = jarFile.getManifest();
				
				if (manifest != null) {
//					System.out.println(manifest);
					Attributes mainAttributes = manifest.getMainAttributes();
					
					if (mainAttributes != null) {
//						System.out.println(mainAttributes);
						String classpath = mainAttributes.getValue(Name.CLASS_PATH);
						
						if (classpath != null) {
//							System.out.println(classpath);
							StringTokenizer stringTokenizer = new StringTokenizer(classpath);
							
							while (stringTokenizer.hasMoreTokens()) {
								String token = stringTokenizer.nextToken();
								URL entry = new URL(url, token);
								
								if (entry.toString().endsWith("/")) {
//									System.out.println(entry);
									classes.addAll(getMatchedClasses(matcher, new File(URLDecoder.decode(entry.getPath(), "UTF-8"))));
								} else {
//									System.out.println(entry);
									classes.addAll(getMatchedClasses(matcher, new JarFile(URLDecoder.decode(entry.getPath(), "UTF-8"))));
								}
							}
						}
					}
				}
				
				classes.addAll(getMatchedClasses(matcher, jarFile));
			} else {
				File base = new File(URLDecoder.decode(url.getPath(), "UTF-8"));
				classes.addAll(getMatchedClasses(matcher, base));
			}
		}
		
		return classes;
	}
public Set<T> resolve(Matcher<T> matcher) throws IOException {
		Set<T> classes = new HashSet<T>();
		
		for (URL url : paths) {
			if (url.toString().endsWith(".jar")) {
//				System.out.println(url);
				JarFile jarFile = new JarFile(URLDecoder.decode(url.getPath(), "UTF-8"));
				Manifest manifest = jarFile.getManifest();
				
				if (manifest != null) {
//					System.out.println(manifest);
					Attributes mainAttributes = manifest.getMainAttributes();
					
					if (mainAttributes != null) {
//						System.out.println(mainAttributes);
						String classpath = mainAttributes.getValue(Name.CLASS_PATH);
						
						if (classpath != null) {
//							System.out.println(classpath);
							StringTokenizer stringTokenizer = new StringTokenizer(classpath);
							
							while (stringTokenizer.hasMoreTokens()) {
								String token = stringTokenizer.nextToken();
								URL entry = new URL(url, token);
								
								if (entry.toString().endsWith("/")) {
//									System.out.println(entry);
									classes.addAll(getMatchedClasses(matcher, new File(URLDecoder.decode(entry.getPath(), "UTF-8"))));
								} else {
//									System.out.println(entry);
									classes.addAll(getMatchedClasses(matcher, new JarFile(URLDecoder.decode(entry.getPath(), "UTF-8"))));
								}
							}
						}
					}
				}
				
				classes.addAll(getMatchedClasses(matcher, jarFile));
			} else {
				File base = new File(URLDecoder.decode(url.getPath(), "UTF-8"));
				classes.addAll(getMatchedClasses(matcher, base));
			}
		}
		
		return classes;
	}
Resolves the {@code Class}es that matches to the specified {@code Matcher}.

@param matcher {@code Matcher}.
@return {@code Class}es that matches to the specified {@code Matcher}.
@throws IOException If any I/O access fails while traversing the search
path.