Ranides Atterwim 4 년 전
부모
커밋
97b2e38bd3
1개의 변경된 파일15개의 추가작업 그리고 7개의 파일을 삭제
  1. 15 7
      assira.core/src/main/java/net/ranides/assira/reflection/util/ServiceScanner.java

+ 15 - 7
assira.core/src/main/java/net/ranides/assira/reflection/util/ServiceScanner.java

@@ -10,6 +10,7 @@ import net.ranides.assira.text.StringTraits;
 import net.ranides.assira.text.StringUtils;
 
 import java.io.IOException;
+import java.lang.reflect.Constructor;
 import java.net.URL;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -32,7 +33,7 @@ public class ServiceScanner<S> {
     private ServiceScanner(Class<S> service) {
         this.service = service;
         this.loader = ClassLoader.getSystemClassLoader();
-        this.resolver = name -> Optional.of(service.cast(Class.forName(name, false, loader).newInstance()));
+        this.resolver = this::resolvePublic;
         this.listener = error -> { };
     }
 
@@ -45,6 +46,10 @@ public class ServiceScanner<S> {
         return this;
     }
 
+    public ServiceScanner<S> resolvePrivate() {
+        return resolver(this::resolvePrivate);
+    }
+
     public ServiceScanner<S> resolver(ServiceResolver<S> handler) {
         ServiceResolver<S> prev = this.resolver;
         this.resolver = name -> {
@@ -119,13 +124,16 @@ public class ServiceScanner<S> {
         return Optional.of(name);
     }
 
-    private Optional<S> makeInstance(Class<? extends S> type) {
-        try {
-            return Optional.of(type.newInstance());
-        } catch (InstantiationException | IllegalAccessException e) {
-            listener.accept(e);
-            return Optional.empty();
+    private Optional<S> resolvePublic(String name) throws ReflectiveOperationException {
+        return Optional.of(service.cast(Class.forName(name, false, loader).newInstance()));
+    }
+
+    private Optional<S> resolvePrivate(String name) throws ReflectiveOperationException {
+        Constructor<?> ctor = Class.forName(name, false, loader).getConstructor();
+        if(!MemberTraits.isPublic(ctor)) {
+            ctor.setAccessible(true);
         }
+        return Optional.of(service.cast(ctor.newInstance()));
     }
 
     private Optional<S> makeInstance(String name) {