1. 程式人生 > >01設計模式——反射

01設計模式——反射

設計 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設計模式——反射