实例化同一个包中所有类
时间: 2023-05-26 14:01:06 浏览: 77
A:
要实例化同一个包中所有类,可以遵循以下步骤:
1.获取包名:
```java
String packageName = "com.example.packageName";
```
2.获取包下的所有类名
```java
Class<?>[] classes = PackageUtil.getClasses(packageName);
```
3.遍历所有类并实例化
```java
for(Class<?> cls : classes){
Object obj = cls.newInstance();
// 对obj进行操作
}
```
PackageUtil.getClasses()方法实现如下:
```java
public class PackageUtil {
public static Class<?>[] getClasses(String packageName) throws ClassNotFoundException, IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList<Class<?>> classes = new ArrayList<>();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes.toArray(new Class[0]);
}
private static List<Class<?>> findClasses(File directory, String packageName) throws ClassNotFoundException {
List<Class<?>> classes = new ArrayList<>();
if (!directory.exists()) {
return classes;
}
File[] files = directory.listFiles();
assert files != null;
for (File file : files) {
if (file.isDirectory()) {
assert !file.getName().contains(".");
classes.addAll(findClasses(file, packageName + "." + file.getName()));
} else if (file.getName().endsWith(".class")) {
classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
}
}
return classes;
}
}
```
注意:该方法只能实例化无参构造方法的类,如有参数构造方法要进行额外处理。