01設計模式——反射
阿新 • • 發佈:2018-03-13
設計 object catch generate ons lang 1.2 tle 應用
1. 設計模式———反射
1.1. Java反射技術
Java 反射技術應用廣泛,他能夠配置,類的全限定名、方法和參數,完成對象的初始化,甚至是反射某些方法。這樣就可以大大增強了Java的可配置性,spring IOC 的基本原理也是如此
1.2. 通過反射構建對象
1.2.1. 反射創建無參實體類
1 public class ReflectServiceImpl { 2 3 public void sayHello(String name){ 4 System.err.println("hello" + name); 5 }6 7 public static ReflectServiceImpl getInstance(){ 8 ReflectServiceImpl object = null; 9 try{ 10 object = (ReflectServiceImpl) Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl").newInstance(); 11 }catch(Exception e){ 12 e.printStackTrace();13 } 14 return object; 15 } 16 }
關註的重點
Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl").newInstance();
1.2.2. 一個 成員變量的實體類
1 public class ReflectServiceImpl2 { 2 3 private String name; 4 5 public ReflectServiceImpl2(String name) { 6 super(); 7 this.name = name; 8 } 9 10 // 帶構造方法的hello 11 public void sayHello(){ 12 System.out.println("hello " + name); 13 } 14 15 public static ReflectServiceImpl2 getInstance(String name){ 16 ReflectServiceImpl2 object = null; 17 18 // 進行反射 19 try { 20 object = (ReflectServiceImpl2) Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl2").getConstructor(String.class).newInstance(name); 21 } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException 22 | NoSuchMethodException | SecurityException | ClassNotFoundException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } 26 27 return object; 28 } 29 }
添加了成員變量
註意:Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl2").getConstructor(String.class).newInstance(name);
getConstructor(Class<?>...) 是可變參數:參數的類型的 .class
多個成員變變量(偽代碼)
object = (ReflectServiceImpl3) Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl3").getConstructor(String.class,int.class).newInstance(name, age);
紅色內容表示參數類型。綠色表示的是 參數的數值
1.1. 通過反射構建 方法
方法的反射,表明已經有對象。進行方法的反射;
方法包括的參數 ;沒有參數。一個參數。多個參數;三種情況
public class ReflectMethod { // 無參數 ,無返回值 public void sayHello(){ System.out.println("hello"); } // 無參數,有返回值 public String returnHello(){ return "hello"; } // 一個參數,有返回值 public int addOne(int num) { // 輸入的數字加上 1 return num + 1; } // 多個參數,有返回值 public int plusNun(int x,int y){ return x + y; } }
反射的代碼
在使用反射方法前要獲取方法對象,得到了方法才能夠去反射。
public class ReflectMethodTest { // 使用反射方法前,先獲取反射對象 ReflectMethod reflectMethod = new ReflectMethod(); // 無參數 無返回值 @Test public void test1() throws Exception { Method method = reflectMethod.getClass().getDeclaredMethod("sayHello", null); method.invoke(reflectMethod, null); } // 一個參數,有返回值 @Test public void test2() throws Exception { Method method = reflectMethod.getClass().getDeclaredMethod("addOne", int.class); Object invoke = method.invoke(reflectMethod, 25); System.out.println(invoke); } // 多個參數 @Test public void test3() throws Exception { Method method = reflectMethod.getClass().getDeclaredMethod("plusNun", int.class,int.class); Object invoke = method.invoke(reflectMethod, 25,3); System.out.println(invoke); } }
方法的反射,表明已經有對象。進行方法的反射;
方法包括的參數 ;沒有參數。一個參數。多個參數;三種情況
01設計模式——反射