文章目录
  • 1. 概念
  • 2. 功能
  • 3. 实践
  • 概念

      

    反射机制指的是程序在运行时能够获取自身的信息。

    功能

      

    1)可以判断运行时对象所属的类   
    2)可以判断运行时对象所具有的成员变量和方法   
    3)通过反射可以调用到private的方法   
    4)生成动态代理

    实践


    对于1-3的功能,我写了这样的例子。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
                        
    package com.test.reflectdemo;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    public class FruitModel {
    private int apple = 2;
    private int orange = 8;
    private int add(int x, int y) {
    return x + y;
    }
    public int getApple(){
    return apple;
    }
    public int getOrange(){
    return orange;
    }
    }

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
                        
    package com.test.reflectdemo;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    public class ReflectDemo {
    public static void main(String[] args) throws Exception {
    FruitModel fruitmodel = new FruitModel();
    Class classType = fruitmodel.getClass();
    Field field = classType.getDeclaredField("apple");
    field.setAccessible(true);
    Class classType = fruitmodel.getClass();
    Method method = classType.getDeclaredMethod("add", new, Class[]{Integer.TYPE,Integer.TYPE});
    method.setAccessible(true);
    //打印初始时的水果数量
    System.out.println("The number of apple : "+String.valueOf(fruitmodel.getApple()));
    System.out.println("The number of orange : "+String.valueOf(fruitmodel.getOrange()));
    //通过反射调用FruitModel中私有方法add求值
    int result1 = (int) method.invoke(fruitmodel, new Object[] {fruitmodel.getApple(),fruitmodel.getOrange()});
    //打印初始时水果总数
    System.out.println("The total number of fruit : "+String.valueOf(result1));
    //通过反射修改苹果数量
    field.set(fruitmodel, 4);
    //打印修改后的水果数量
    System.out.println(""The number of apple : "+String.valueOf(fruitmodel.getApple()));
    System.out.println("The number of orange : "+String.valueOf(fruitmodel.getOrange()));
    //打印修改后的水果总数
    int result2 = (int) method.invoke(fruitmodel, new Object[] {fruitmodel.getApple(),fruitmodel.getOrange()});
    System.out.println("Now,the total number of fruit : "+String.valueOf(result2));
    }
    }


    运行后,打印结果如下:

    The number of apple : 2
    The number of orange : 8
    The total number of fruit : :10
    The number of apple : 4
    The number of orange : 8
    Total number of fruit : 12


    通过打印结果,发现apple的数值的确改变了,通过反射修改其他类的私有变量是可行的。

    这样就搞定了喵喵哒。

    关于生成动态代理,也是一个有趣的点,只不过有些不容易搞懂。
    代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下, 一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式一般涉及到的角色 (1)抽象角色:声明真实对象和代理对象的共同接口 (2)代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装 (3)真实角色:代理角色所代表的真实对象,是我们最终要引用的对象 实例】 Subject 抽象类 抽象角色 定义一个抽象方法request RealSubject 真实角色 继承了抽象类Subject 实现抽象方法request ProxySubject 代理角色 同样继承抽象类Subject实现抽象方法request Client 客户端

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
                        
    package com.test.reflectdemo;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    public classFruitModel {
    private int apple = 2;
    private int orange = 8;
    private int add(int x, int y) {
    return x + y;
    }
    public int getApple(){
    return apple;
    }
    public int getOrange(){
    return orange;
    }
    }
    1
    2
    3
    4
                        
    //抽象角色
    abstract public class Subject {
    abstract public void request();
    }
    1
    2
    3
    4
                        
    //真实角色:实现了Subject的request()方法
    public class RealSubject extends Subject {
    public RealSubject(){}
    public void request(){
    System.out.println("局长办事了!");
    }
    }
    1
    2
    3
    4
                        
    //代理角色
    public class ProxySubject extends Subject {
    private RealSubject realSubject;// 以真实角色作为代理角色的属性
    public ProxySubject(){}
    // 该方法封装了真实对象的request方法
    public void request(){
    preRequest();
    if (realSubject == null){
    preRequest();
    preRequest();
    }
    }
    1
    2
    3
    4
                        
    //代理角色
    public class ProxySubject extends Subject {
    private RealSubject realSubject;// 以真实角色作为代理角色的属性
    public ProxySubject(){}
    // 该方法封装了真实对象的request方法
    public void request(){
    preRequest();
    if (realSubject == null){
    preRequest();
    preRequest();
    }
    }
    //代理角色 public class ProxySubject extends Subject{ private RealSubject realSubject; // 以真实角色作为代理角色的属性 public ProxySubject(){ }  // 该方法封装了真实对象的request方法 public void request(){ preRequest(); if (realSubject == null){ realSubject = new RealSubject(); } realSubject.request(); // 此处执行真实对象的request方法 postRequest(); } private void preRequest(){ System.out.println("秘书去找局长"); } private void postRequest(){ System.out.println("秘书回来了"); } } //客户端调用 public class Client{ public static void main(String[] args){ Subject sub = new ProxySubject(); sub.request(); } }

    Fork me on GitHub