Advertisement
Alex56

for_Vadim

Jun 29th, 2016
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.97 KB | None | 0 0
  1. package com.javarush.test.level36.lesson10.bonus01;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.lang.reflect.Constructor;
  8. import java.lang.reflect.InvocationTargetException;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11.  
  12. /* Осваиваем ClassLoader и Reflection
  13. Аргументом для класса Solution является абсолютный путь к пакету,
  14. например, "C:\JavaRushHomeWork\src\com\javarush\test\level36\lesson10\bonus01\data\second".
  15. Имя пакета может содержать File.separator.
  16. В этом пакете находятся только скомпилированные классы.
  17. Известно, что каждый класс имеет конструктор без параметров и реализует интерфейс HiddenClass.
  18. Считайте все классы с файловой системы, создайте фабрику - реализуйте метод getHiddenClassObjectByKey.
  19. Известно, что есть только один класс, простое имя которого начинается с String key без учета регистра.
  20. */
  21. public class Solution {
  22.     private List<Class> hiddenClasses = new ArrayList<>();
  23.     private String packageName;
  24.     public Solution(String packageName) {
  25.         this.packageName = packageName;
  26.     }
  27.  
  28.     public static void main(String[] args) throws ClassNotFoundException {
  29.         Solution solution = new Solution("D:\\Kurs\\JavaRushHomeWork\\out\\production\\JavaRushHomeWork\\com\\javarush\\test\\level36\\lesson10\\bonus01\\data\\second");
  30.         solution.scanFileSystem();
  31.         System.out.println(solution.getHiddenClassObjectByKey("hiddenclassimplse"));
  32.         System.out.println(solution.getHiddenClassObjectByKey("hiddenclassimplf"));
  33.         System.out.println(solution.getHiddenClassObjectByKey("packa"));
  34.     }
  35.  
  36.     public void scanFileSystem() throws ClassNotFoundException {
  37.     File dir = new File(packageName);
  38.     String[] classFiles = dir.list();
  39.     for (String file : classFiles) {
  40.         final String finalPath = dir.getAbsolutePath() + File.separator;
  41.         ClassLoader loader = new ClassLoader() {
  42.             @Override
  43.             protected Class<?> findClass(String className) throws ClassNotFoundException {
  44.                 byte[] temp = getBytesFromFile(finalPath + className + ".class");
  45.                 return defineClass(null, temp, 0, temp.length);
  46.             }
  47.  
  48.             private byte[] getBytesFromFile(String fileName) {
  49.                 File file = new File(fileName);
  50.                 FileInputStream fis = null;
  51.                 try {
  52.                     fis = new FileInputStream(file);
  53.                 } catch (Exception e) {
  54.                     return null;
  55.                 }
  56.                 BufferedInputStream bis = new BufferedInputStream(fis);
  57.                 int size = (int) file.length();
  58.                 byte[] b = new byte[size];
  59.                 int rb = 0;
  60.                 int chunk = 0;
  61.                 try {
  62.                     while (((int) size - rb) > 0) {
  63.                         chunk = bis.read(b, rb, (int) size - rb);
  64.                         if (chunk == -1) {
  65.                             break;
  66.                         }
  67.                         rb += chunk;
  68.                     }
  69.                 } catch (IOException e) {
  70.                     try {
  71.                         throw new ClassNotFoundException();
  72.                     } catch (ClassNotFoundException e1) {
  73.                         e1.printStackTrace();
  74.                     }
  75.                     return null;
  76.                 }
  77.                 return b;
  78.             }
  79.         };
  80.  
  81.         Class clazz = loader.loadClass(file.substring(0, file.lastIndexOf(".")));
  82.         if (HiddenClass.class.isAssignableFrom(clazz)) {
  83.             hiddenClasses.add(clazz);
  84.         }
  85.     }
  86. }
  87.  
  88.     public HiddenClass getHiddenClassObjectByKey(String key) {
  89.         for(Class clazz: hiddenClasses){
  90.             if(clazz.getSimpleName().toLowerCase().startsWith(key.toLowerCase())){
  91.                 try {
  92.                     Constructor[] constructors = clazz.getDeclaredConstructors();
  93.                     for(Constructor constructor: constructors){
  94.                         if(constructor.getParameterTypes().length==0){
  95.                             constructor.setAccessible(true);
  96.                             return (HiddenClass) constructor.newInstance(null);
  97.                         }
  98.                     }
  99.                 }
  100.                 catch (InstantiationException e) {
  101.                     e.printStackTrace();
  102.                 }
  103.                 catch (IllegalAccessException e) {
  104.                     e.printStackTrace();
  105.                 }
  106.                 catch (InvocationTargetException e) {
  107.                     e.printStackTrace();
  108.                 }
  109.             }
  110.         }
  111.         return null;
  112.     }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement