通過反射獲得對象的方法
准備工作:
有一個User類如下
1 package o1; 2 3 /** 4 * Created by yesiming on 16-11-19. 5 */ 6 public class User { 7 private int id; 8 private String name 9 10 // 無參構造方法 11 public User() { 12 System.out.println("new Instance() 1"); 13 } 14 // 有參構造方法 15 public User(int id, String name) { 16 System.out.println(id + ":" + name + ":new Instance() 2"); 17 } 18 // get set 省略 19 }
下面寫得到User對象的幾種方法:
1 package o1; 2 3 import org.junit.Test; 4 5 import java.io.File; 6 import java.lang.reflect.*; 7 import java.lang.reflect.InvocationTargetException; 8 import java.net.URI; 9 import java.net.URL; 10 11 /** 12 * Created by yesiming on 16-11-19. 13 */ 14 public class MainTest { 15 16 @Test 17 public void getClazz() { 18 Class clazz = User.class; // 得到User的類描述 19 System.out.println(clazz.toString()); 20 } 21 22 @Test 23 public void getClazz1() { 24 Class clazz = User.class; 25 try { 26 Object obj = clazz.newInstance(); // 通過類描述的newInstance()方法可以得到該類的對象(內部會調用無參構造方法) 27 System.out.println(obj.toString()); 28 } catch (Exception e) { 29 30 } finally { 31 } 32 } 33 34 @Test 35 public void getClazz2() { 36 Class clazz = User.class; 37 try { 38 // 通過類描述的getDeclaredConstructor(Class... clazz)方法得到對應的構造函數 39 Constructor constructor = clazz.getDeclaredConstructor(int.class, String.class); 40 // 通過對應的構造函數的newInstance(xxx, xxx)方法得到類對象 41 Object obj = constructor.newInstance(1, "iming"); // 通過 42 System.out.println(obj.toString()); 43 } catch (InstantiationException e) { 44 e.printStackTrace(); 45 } catch (IllegalAccessException e) { 46 e.printStackTrace(); 47 } catch (InvocationTargetException e) { 48 e.printStackTrace(); 49 } catch (NoSuchMethodException e) { 50 e.printStackTrace(); 51 } 52 } 53 54 /** 55 * 通過getMethod(String methodName)得到方法描述符 56 * 通過方法描述符的invode(類描述符 xxx )方法,執行該方法 57 */ 58 @Test 59 public void getMethod() throws Exception { 60 Class clazz = User.class; 61 Constructor constructor = clazz.getDeclaredConstructor(int.class, String.class); 62 Object obj = constructor.newInstance(1, "yesiming"); 63 Method m = clazz.getMethod("setName", String.class); 64 m.invoke(obj, "Haha"); 65 66 Method m2 = clazz.getMethod("getName"); 67 Object obj1 = m2.invoke(obj); 68 System.out.println(obj1.toString()); 69 } 70 71 /** 72 * 得到指定包名下所有的類 73 */ 74 @Test 75 public void getClasses() throws Exception { 76 Class clazz = User.class; 77 ClassLoader loader = clazz.getClassLoader(); 78 // 1. 通過classloader載入包路徑,得到url 79 URL url = loader.getResource("o1/o1_a"); 80 URI uri = url.toURI(); 81 // 2. 通過File獲得uri下的所有文件 82 File file = new File(uri); 83 File[] files = file.listFiles(); 84 for (File f : files) { 85 String fName = f.getName(); 86 if (!fName.endsWith(".class")) { 87 continue; 88 } 89 fName = fName.substring(0, fName.length() - 6); 90 String perfix = "o1.o1_a."; 91 String allName = perfix + fName; 92 // 3. 通過反射加載類 93 clazz = Class.forName(allName); 94 System.out.println(clazz); 95 } 96 } 97 98 }
