|
55 | 55 | import java.util.Collection; |
56 | 56 | import java.util.Iterator; |
57 | 57 |
|
| 58 | +import org.slf4j.Logger; |
| 59 | +import org.slf4j.LoggerFactory; |
| 60 | + |
58 | 61 |
|
59 | 62 | /** |
60 | 63 | * Walks a file tree, generating a sequence of events corresponding to the files in the tree. |
@@ -240,43 +243,59 @@ IOException ioeException() |
240 | 243 | } |
241 | 244 |
|
242 | 245 | // region Reflect access BasicFileAttributesHolder |
243 | | - private boolean initializedBasicFileAttributesHolderClazz; |
244 | | - private Class<?> basicFileAttributesHolderClazz; |
245 | | - private Method mBasicFileAttributesHolderGet; |
| 246 | + private static boolean initializedBasicFileAttributesHolderClazz; |
| 247 | + private static Class<?> basicFileAttributesHolderClazz; |
| 248 | + private static Method mBasicFileAttributesHolderGet; |
| 249 | + private static boolean wasBasicFileAttributesHolderGetAccessSuccess; |
246 | 250 |
|
247 | | - private void initBasicFileAttributesHolderClazz() |
| 251 | + private static void initBasicFileAttributesHolderClazz() |
248 | 252 | { |
249 | | - if(!this.initializedBasicFileAttributesHolderClazz) |
| 253 | + if(!initializedBasicFileAttributesHolderClazz) |
250 | 254 | { |
251 | 255 | try |
252 | 256 | { |
253 | | - this.basicFileAttributesHolderClazz = Class.forName("sun.nio.fs.BasicFileAttributesHolder"); |
254 | | - this.mBasicFileAttributesHolderGet = this.basicFileAttributesHolderClazz.getMethod("get"); |
255 | | - this.mBasicFileAttributesHolderGet.setAccessible(true); |
| 257 | + basicFileAttributesHolderClazz = Class.forName("sun.nio.fs.BasicFileAttributesHolder"); |
| 258 | + mBasicFileAttributesHolderGet = basicFileAttributesHolderClazz.getMethod("get"); |
| 259 | + mBasicFileAttributesHolderGet.setAccessible(true); |
256 | 260 | } |
257 | 261 | catch(final Exception ignored) |
258 | 262 | { |
259 | 263 | // Ignored |
260 | 264 | } |
261 | | - this.initializedBasicFileAttributesHolderClazz = true; |
| 265 | + initializedBasicFileAttributesHolderClazz = true; |
262 | 266 | } |
263 | 267 | } |
264 | 268 |
|
265 | | - private boolean isBasicFileAttributesHolder(final Path file) |
| 269 | + private static boolean isBasicFileAttributesHolder(final Path file) |
266 | 270 | { |
267 | | - this.initBasicFileAttributesHolderClazz(); |
| 271 | + initBasicFileAttributesHolderClazz(); |
268 | 272 |
|
269 | | - return this.basicFileAttributesHolderClazz != null |
270 | | - && this.basicFileAttributesHolderClazz.isInstance(file); |
| 273 | + return basicFileAttributesHolderClazz != null |
| 274 | + && basicFileAttributesHolderClazz.isInstance(file); |
271 | 275 | } |
272 | 276 |
|
273 | | - private BasicFileAttributes extractFromBasicFileAttributesHolder(final Path file) |
| 277 | + private static BasicFileAttributes extractFromBasicFileAttributesHolder(final Path file) |
274 | 278 | { |
275 | 279 | try |
276 | 280 | { |
277 | | - return (BasicFileAttributes)this.mBasicFileAttributesHolderGet.invoke(file); |
| 281 | + final BasicFileAttributes attrs = (BasicFileAttributes)mBasicFileAttributesHolderGet.invoke(file); |
| 282 | + wasBasicFileAttributesHolderGetAccessSuccess = true; |
| 283 | + return attrs; |
| 284 | + } |
| 285 | + catch(final IllegalAccessException ex) |
| 286 | + { |
| 287 | + // Did we ever access it successfully? |
| 288 | + if(!wasBasicFileAttributesHolderGetAccessSuccess) |
| 289 | + { |
| 290 | + basicFileAttributesHolderClazz = null; |
| 291 | + mBasicFileAttributesHolderGet = null; |
| 292 | + final Logger logger = LoggerFactory.getLogger(FileTreeWalker.class); |
| 293 | + logger.warn("Failed to access BasicFileAttributesHolder", ex); |
| 294 | + logger.warn("To fix this add '--add-exports java.base/sun.nio.fs=ALL-UNNAMED' as VM options"); |
| 295 | + } |
| 296 | + return null; |
278 | 297 | } |
279 | | - catch(final IllegalAccessException | InvocationTargetException ignored) |
| 298 | + catch(final InvocationTargetException ignored) |
280 | 299 | { |
281 | 300 | return null; |
282 | 301 | } |
|
0 commit comments