リフレクションの原理と動的プロキシモードの使用法

反射

リフレクションの使用法を理解する:
リフレクション1
リフレクション2
練習

public class Servant {
    
    
    private int a;
    private String str;
    public Servant() {
    
    
    }
    public Servant(String string,int _a) {
    
    
    }
    public int getA() {
    
    
        return a;
    }
    public void setA(int a) {
    
    
        this.a = a;
    }
    public String getStr() {
    
    
        return str;
    }
}


public class Main {
    
    
    public static void main(String[] args) {
    
    
    System.out.println("-----------------反射基本使用-------------------");
//1获取类对象 3种方式
    Servant servant = new Servant();
    Class<?> clazz = servant.getClass(); //方式1
    Class<?> clazz1 = Servant.class; //方式2
    try {
    
    
        Class<?> clazz2 = Class.forName("Reflection.Servant"); //方式3
    }catch (ClassNotFoundException e) {
    
    
        e.printStackTrace();
    }
//创建对象
    try {
    
    
    Class<?> clazz3 = Servant.class;
    Servant servant1 = (Servant)clazz3.getDeclaredConstructor().newInstance();
    servant1.setA(10);
    System.out.println(servant1.getA());
    } catch (InstantiationException e) {
    
    
        e.printStackTrace();
    } catch (InvocationTargetException e) {
    
    
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
    
    
        e.printStackTrace();
    } catch (IllegalAccessException e) {
    
    
    e.printStackTrace();
}
/*************************************************************************************/
System.out.println("获取构所有构造函数---------------");
    Class<?> clazz4 = Servant.class;
    Constructor[] constructors = clazz4.getDeclaredConstructors();
    for (Constructor constructor:constructors) {
    
    
        System.out.println(constructor);
    }
    try {
    
    
    System.out.println("获取指定构造函数---------------");
    Class<?> clazz5 = Servant.class;
    Constructor constructor = clazz5.getDeclaredConstructor(String.class,int.class);
    System.out.println(constructor);
    } catch (NoSuchMethodException e) {
    
    
        e.printStackTrace();
    }

/*************************************************************************************/
System.out.println("获取类中所有的方法---------------");
    Class<?> clazz6 = Servant.class;
    Method[] methods = clazz6.getMethods();
    for (Method method:methods) {
    
    
        System.out.println(method);
    }
System.out.println("获取指定方法----------------");
    try {
    
    
    Method method = clazz6.getDeclaredMethod("setA",int.class);
    method.setAccessible(true);
    System.out.println(method);
    method.setAccessible(false);
    } catch (NoSuchMethodException e) {
    
    
        e.printStackTrace();
    }
/*************************************************************************************/
System.out.println("获取类中所有成员变量------------------");
    Class<?> clazz7 = Servant.class;
    Field[] fields = clazz7.getDeclaredFields();
    for (Field field:fields) {
    
    
        System.out.println(field);
    }
System.out.println("获取类中指定成员变量--------------");
    Class<?> clazz8 = Servant.class;
    try {
    
    
    Field field = clazz8.getDeclaredField("str");
    System.out.println(field);
    Servant servant1 = new Servant();
    field.setAccessible(true);
    field.set(servant1,"12345678");
    System.out.println(field.getName()+" "+servant1.getStr());
    } catch (NoSuchFieldException e) {
    
    
        e.printStackTrace();
    } catch (IllegalAccessException e) {
    
    
    e.printStackTrace();
    }
    }
}

エージェンシーモデル

定義:プロキシモードは、ターゲットオブジェクトにプロキシオブジェクトを提供することであり、プロキシオブジェクトはターゲットオブジェクトの参照を制御します。素人の言葉で言えば、それは私たちの生活の中で一般的な仲介者です。
目的:
(1)ターゲットオブジェクトへの直接アクセスによって引き起こされる不必要な複雑さを防ぐためにプロキシオブジェクトを導入することによるターゲットオブジェクトへの間接アクセス。
(2)プロキシオブジェクトを介して元のビジネスを強化します。
プロキシモードは、静的プロキシと動的プロキシに分けられます

静的プロキシ

抽象ロール:
エージェントロールと実ロールのパブリック外部メソッドを定義します。
実ロール:
抽象ロールを実現し、エージェントロールが呼び出す実ロールによって実装されるビジネスロジックを定義します。
エージェントロール:
実エージェントである抽象ロールを実現します。抽象メソッドは、実ロールのビジネスロジック方式で実現し、独自のオペレーションを付加することができます。
静的プロキシ:プロキシとプロキシの関係は、プログラムのコンパイル中に決定されます

接口: Start
Start ->实现  RealStart
Start ->实现  ProxyStart 
ProxyStart 是代理类包含RealStart

public interface Start {
    
    
    public void bookTicket();
    public void Config();
    public void CollectMoney();
    public void sing();
}
public class RealStart implements Start{
    
    
    @Override
    public void bookTicket() {
    
    
        System.out.println("RealStart bookTicket");
    }
@Override
public void Config() {
    
    
    System.out.println("RealStart Config");
    }
@Override
public void CollectMoney() {
    
    
    System.out.println("RealStart CollectMoney");
    }
@Override
public void sing() {
    
    
    System.out.println("RealStart sing");
    }
}
public class ProxyStart implements Start {
    
    
    private Start start;
    public ProxyStart(Start _start) {
    
    
        start=_start;
}
@Override
public void bookTicket() {
    
    
    System.out.println("ProxyStart bookTicket");
}
@Override
public void Config() {
    
    
    System.out.println("ProxyStart Config");
}
@Override
public void CollectMoney() {
    
    
    System.out.println("ProxyStart CollectMoney");
}
@Override
public void sing() {
    
    
        start.sing();
    }
}
public static void main(String[] args) {
    
    
    System.out.println("-------------简单代理--------------");
    Start realStart = new RealStart();
    Start proxyStart = new ProxyStart(realStart);

    proxyStart.CollectMoney();
    proxyStart.bookTicket();
    proxyStart.sing();
}

動的プロキシ

静的エージェントと比較した動的エージェントの利点:
エージェントクラスを作成するためのインターフェイスではなく、エージェントクラスを作成するためのインターフェイスのみ。
動的エージェントはリフレクションメカニズムを使用して静的エージェントよりも効率が低くなります。エージェントとエージェントの関係は、次の場合に決定されます。プログラムが実行されています。

InvocationHandler(プロセッサインターフェイス)の実現:
手順:
1。実オブジェクトインターフェイス
2.インターフェイスを実現する実オブジェクトを
作成します
3.InvocationHandlerインターフェイスを実現するオブジェクトを作成します4.Proxy.newProxyInstance(ClassLoader.getSystemClassLoader()、new Class [] {Shop .class}、invocationHandler);プロキシを実装する

パラメータ:
ClassLoaderクラスは
Class <?> []インターフェイスにロードされますプロキシクラスのインターフェイス
InvocationHandlerInvocationHandlerを実装するクラス

public interface Shop {
    
    
        void buy();
}

public class Real implements Shop {
    
    
        @Override
        public void buy() {
    
    
            System.out.println("--买东西--");
        }
}

public class Invocation implements InvocationHandler {
    
    
        public Shop shop;
        public Invocation(Shop _shop) {
    
    
            shop =_shop;
            }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    
            System.out.println("开始海外代购");
            Object object = method.invoke(shop,args);
            System.out.println("海外代购完成");
            return object;
        }
}

public class Main {
    
    
        public static void main(String[] args) {
    
    
            Shop shop = new Real();
            InvocationHandler invocationHandler = new Invocation(shop);

            Shop proxy = (Shop) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{
    
    Shop.class},invocationHandler);
            proxy.buy();
        }
}



例如2public class MarkCompany implements InvocationHandler {
    
    
    private Object factory;//真实对象
    public void setFactory(Object factory) {
    
    
    this.factory = factory;
    }
    public Object getFactory() {
    
    
        return factory;
    }
    public Object getProxyInstance() {
    
    
    //参数1 真实对象的类加载器 参数2 真实对象的接口 参数3 被代理的InvocationHandler
        return Proxy.newProxyInstance(factory.getClass().getClassLoader(),factory.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    
        Object object = null;
        Before();
        object = method.invoke(factory,args);
        After();
        return object;
    }

    public void Before() {
    
    
        System.out.println("开始行动");
    }
    public void After() {
    
    
        System.out.println("行动完成");
    }
}

public interface Shop {
    
    
    public void shopeat();
}

public class Real implements Shop {
    
    
    @Override
    public void shopeat() {
    
    
    System.out.println("代购");
    }
}



public class Main {
    
    
    public static void main(String[] args) {
    
    
    Shop shop = new Real(); //真实对象
    MarkCompany markCompany = new MarkCompany();
    markCompany.setFactory(shop);

    //代理对象1
    Shop shop1 = (Shop) markCompany.getProxyInstance();
    shop1.shopeat();

    //代理对象2
    //代理对象3
    }
}

おすすめ

転載: blog.csdn.net/weixin_41477306/article/details/110259007