澳门威利斯人_威利斯人娱乐「手机版」

来自 网络资讯 2020-01-12 02:51 的文章
当前位置: 澳门威利斯人 > 网络资讯 > 正文

扩展与约束,利用反射构建动态代理

TZ : 我的梦想其实是当一个足球巨星

前言

外包、中介、经纪人... ...。在我们生存中,相符于这种委托与代理的行事方式均能够称呼代理格局。委托者将协调的办事、商品、服务等等委托给另外一方,让其去做到相应的干活、服务,以保险全部环节的科班、功用、开支等等受到震慑。

前言

读书了java的反光,在那之中反射有一条知识点正是能够用于转移代理形式,以此,将Java代理格局教学三遍,还还没看过反射的同室能够去笔者的博客,先读书反射的连带知识,以助于你更加好的明亮Java的代理情势。

*注 : 有疑点,必要解答请留言,作者每个留言都会认真解析解答.

概念

为某些对象提供叁个代理,以决定对这些目的的拜谒。代理类和寄托类有伙同的父类或父接口,那样在此外利用委托类对象的地点都足以用代理对象替代。代理类负担乞请的预管理、过滤、将央求分派给委托类管理、以致委托类施行完央求后的持续管理。

简介

如何是代理:

Proxy(代理)

代办分为静态代理动态代理,静态代理是在编译时就将接口、达成类、代理类全盘托出全部手动达成,但即使大家供给广大的代理,每二个都这么手动的去创制实属浪费时间,并且会有大气的双重代码,那个时候我们就能够利用动态代理,动态代理能够在程序运维期间依据要求动态的创导代理类及其实例,来变成具体的功能,首要用的是JAVA的反射机制

实际方法直接调用就足以做到功效,为啥还要加个代理呢?
原因是选用代理格局能够使得的将具体的兑现与调用方举办解耦,通过面向接口进行编码完全将切实的落实隐蔽在里边。

Proxy代理形式是意气风发种布局型设计形式,重要化解的主题材料是:在一向访谈对象时带给的主题素材

ps:面试有极大概率会问到哦

代办是豆蔻梢头种常用的设计方式,其指标正是为此外对象提供二个代理以决定对有个别对象的探问。代理类肩负为委托类预管理新闻,过滤音讯并转化音信,甚至实行音信被委托类实施后的持续管理。

更易懂的说,代精晓决的主题材料当七个类必要通讯时,引进第三方代理类,将四个类的关联解耦,让大家只询问代理类就能够,况兼代理的现身还足以让我们完毕与另四个类之间的涉及的联合管理,可是切记,代理类和委托类要贯彻平等的接口,因为代理真正调用的还是委托类的秘籍。

固守代理的创设时代,代理类能够分成二种:

  • 静态:由技士创立代理类或一定工具自动生李冠希代码再对其编写翻译。在程序运维前代理类的.class文件就早就存在了。

  • 动态:在程序运维时接收反射机制动态创设而成。

图片 1C罗.png

类图

图片 2

2017-11-27_175222.png

从上类图我们得以看见代理接口(Subject)、代理类(ProxySubject)、委托类(RealSubject)造成三个“品”字构造。

根据代理类的变动时间足以将其分为动态代理和静态代理。动态代理又有啥不可分为jdk代理和cglib代理,前面一个是spring的,所以大家前些天只谈静态代理和jdk代理。

静态代理

实代理的相符形式就是静态代理的落到实处格局:首先成立一个接口(JDK代理都是面向接口的),然后创设具体完成类来完成这一个接口,在开创二个代理类相符达成那些接口,不相同建议在于,具体完结类的法门中必要将接口中定义的章程的事体逻辑作用达成,而代理类中的方法只要调用具体类中的对应措施就能够,那样我们在急需利用接口中的有个别方法的职能时直接调用代理类的情势就可以,将现实的兑现类隐敝在底层。

率先步:定义总接口Iuser.java

 public interface Iuser {
     void eat(String s);
 }

第二步:创建具体落到实处类UserImpl.java

被代理人

public class UserImpl implements Iuser {
  @Override
  public void eat(String s) {
    System.out.println("我要吃" s);
  }
}

其三步:创立代理类UserProxy.java

代理人

public class UserProxy implements Iuser {
  private Iuser user = new UserImpl();
  @Override
  public void eat(String s) {
    System.out.println("静态代理前置内容");
    user.eat(s);
    System.out.println("静态代理后置内容");
  }
}

第四步:成立测验类ProxyTest.java

public class ProxyTest {
  public static void main(String[] args) {    
    UserProxy proxy = new UserProxy();
    proxy.eat("苹果");
  }
}

运行结果:

静态代理前置内容
我要吃苹果
静态代理后置内容

综上的代码和出口结果能够看见,静态代理的完成方式照旧不会细小略的。都亟需完成总接口,代理人里面全数被代理人的对象。代理人能够依照事态的例外,增添一些操作。

2018FIFA World Cup到了,足球巨星C罗表现绝对美丽妙,小编很心爱他,他向来是自己的偶像,他的球技很抢眼,力量很惊人.但是C罗精晓于踢球到场平常练习大概未有的时候间管理日常的无足轻重和中间转播代言一些列的事,所以C罗会找一位,支持她搭话这一切.大家管此人叫做-经纪人

静态代理

静态代理是供给开辟职员手动的去团结强盛编写代理对象及落到实处,比较灵活度低于动态代理,此外,静态代理和装饰者情势非常相仿,两个的显要在于装饰者情势在于对原对象的意义增添,着入眼在于扩展,而静态代理在于对被代理对象开展作业方法的节制;其余装饰者格局棉被服装饰的靶子对外是暴光的,而静态代理掩瞒的。

静态代理类优劣势

  • 优点:

代理使客商端无需领会达成类是怎么着,怎么办的,而客商端只需精晓代理就可以(解耦合)。

  • 缺点:

1)代理类和委托类完结了同样的接口,代理类通过委托类实现了后生可畏致的不二等秘书技。那样就现身了大气的代码重复。固然接口扩张三个主意,除了具备实现类须要得以达成这几个点子外,全部代理类也亟需落成此方法。扩张了代码维护的复杂度。

2)代理对象只服务于风度翩翩种档案的次序的靶子,倘使要服务多类型的靶子。势供给为每意气风发种对象都举行代理,静态代理在前后相继层面稍大时就不可能胜任了

举个例子表达:代理能够对落到实处类进行统豆蔻梢头的管制,如在调用具体落到实处类早前,须求打字与印刷日志等新闻,那样大家只需求加上一个代理类,在代理类中加上打字与印刷日志的效率,然后调用达成类,那样就幸免了更改具体贯彻类。满意我们所说的开闭原则。不过意气风发旦想让种种完毕类都增进打字与印刷日志的法力的话,就必要加上四个代理类,以致代理类中逐一艺术都须求增添打字与印刷日志效用(如上的代理方法中去除,修正,以至查询都急需增多上打字与印刷日志的功用)
即静态代理类只好为一定的接口(Service卡塔尔(قطر‎服务。如想要为几个接口服务则必要创建非常多少个代理类。

在那处大家得以把C罗可以称作被代理类,把她的经纪人叫做代理类

案例(静态代理)

以下我们依据上边类图模拟三个案例,委托类独有贰个打字与印刷格局,代理类要求实施委托类的寄托职分,还要计算出耗时

三个公家的天职接口

public interface IUserDao {
    void save() throws InterruptedException;
}

三个接口达成(委托类)

public class UserDao implements IUserDao {
    public void save() throws InterruptedException {
        Thread.sleep(2000);
        System.out.println("----------save---------");
    }
}

另三个接口落成(代理类)它需求实现与委托类相像的接口,因为要做到委托类的职务

public class UserDaoProxy implements IUserDao {

    //接收目标对象
    private IUserDao target;

    public UserDaoProxy (IUserDao target){
        this.target = target;
    }

    public void save() throws InterruptedException {
        Long start = System.currentTimeMillis();

        //System.out.println("执行扩展功能,如开启事务... ...");
        System.out.println("start:"   start);

        target.save();//执行目标对象的方法

        Long end = System.currentTimeMillis();
        //System.out.println("执行扩展功能,如关闭事务... ...");
        System.out.println("end:"   end);

        System.out.println("处理时间为:"   (end-start)   " 毫秒");

    }
}

三个测量检验类

public class App {

    @Test
    public void testSave() throws InterruptedException{
        IUserDao target = new UserDao();

        //代理
        IUserDao proxy = new UserDaoProxy(target);
        proxy.save();//这里执行的是代理对象的save方法,代理对象的save方法是目标对象save方法的扩展
    }
    /**
     * 静态代理:
     * 
     *      实现原则:代理对象,要实现与目标对象一样的接口;
     *              1,代理类一般要持有一个被代理的对象的引用。
                    2,对于我们不关心的方法,全部委托给被代理的对象处理。
                    3,自己处理我们关心的方法。
     * 
     *      举例:
            保存用户(模拟)
                Dao  ,  直接保存
                DaoProxy, 给保存方法添加事务处理
     * 
     *      优点:可以做到在不修改目标对象的功能前提下,对目标对象功能扩展。
     *      缺点:
     *          1.因为代理对象,需要与目标对象实现一样的接口。所以会有很多代理类,类太多。
     *          2.一旦接口增加方法,目标对象与代理对象都要维护。
     */
}

图片 3

2017-11-27_180903.png

动态代理

动态代理的思量方式与前边的平常方式是一律的,也是面向接口举办编码,创设代理类将具体类隐敝解耦,不一样之处在于代理类的创立机会不如,动态代理要求在运转时因需实时创立。

先是步:定义总接口Iuser.java

public interface Iuser {
  void eat(String s);
}

其次步:创造具体落到实处类UserImpl.java

被代理人

public class UserImpl implements Iuser {
  @Override
  public void eat(String s) {
    System.out.println("我要吃" s);
  }
}

其三步:成立实现InvocationHandler接口的代理类

代理人

//动态代理类只能代理接口(不支持抽象类),代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类  
public class DynamicProxy implements InvocationHandler {
  private Object object;//用于接收具体实现类的实例对象
  //使用带参数的构造器来传递具体实现类的对象
  public DynamicProxy(Object obj){
    this.object = obj;
  }
  @Override
  public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
    System.out.println("前置内容");
    method.invoke(object, args);
    System.out.println("后置内容");
    return null;
  }
}

第四步:创制测量试验类ProxyTest.java

public class ProxyTest {
  public static void main(String[] args) {
    Iuser user = new UserImpl();
    InvocationHandler h = new DynamicProxy(user);
    Iuser proxy = (Iuser) Proxy.newProxyInstance(Iuser.class.getClassLoader(), new Class[]{Iuser.class}, h);
    proxy.eat("苹果");
  }
}

运作结果为:

动态代理前置内容
我要吃苹果
动态代理后置内容

大家创制三个接口来定义一下C罗一些能力

静态代理优弱点

动态代理的落实进度

**1. **率先小编要说的正是接口,为啥JDK的动态代理是基本接口达成的啊?
  因为通过动用接口指向完结类的实例的多态完成形式,能够使得的将切实的完结与调用之间解耦,便于早先时期修改与保安。
再具体的说就是大家在代理类中创制五个私家成员变量(private修饰),使用接口来指向完毕类的目的(纯种的多态展现,向上转型的反映),然后在该代理类中的方法中运用那么些创设的实例来调用达成类中的相应措施来变成专业逻辑功能。
那般提及来,小编事先说的“将现实完结类完全隐形”就有个别正确了,能够改成,将具体落到实处类的细节向调用方完全隐形(调用方调用的是代理类中的方法,并不是完成类中的方法)。
  那就是面向接口编制程序,利用java的多态性格,达成程序代码的解耦。

2. 成立代理类的历程
  借使您打探静态代理,那么你会开掘动态代理的完结其实与静态代理相似,都亟需成立代理类,可是差别之处也很明朗,创设方式各异!
  分歧之处体现在静态代理大家耳濡目染,大家领略要对哪些接口、哪个完毕类来创造代理类,所以大家在编写翻译前就径直达成与落实类相近的接口,直接在落到实处的法门中调用完成类中的相应(同名)方法就能够;而动态代理分歧,我们不晓得它哪天创立,也不精晓要成立针对哪个接口、达成类的代理类(因为它是在运维时因需实时创制的)。
  即便双方创设机遇不如,创立格局也不一样等,不过原理是豆蔻梢头致的,不一样的地方仅仅是:静态代理可以直接编码创制,而动态代理是应用反射机制来抽象出代理类的创立进度。

interface ability{ //踢球比赛 void footballMatch(); //CR7代言 void cR7(); //购买健身器材 void shopping();}
亮点:业务类只供给关切工作逻辑本人

分析

**1. **静态代理须求贯彻与贯彻类相符的接口,而动态代理需求达成的是牢固的Java提供的嵌入接口(朝气蓬勃种特别提供来创造动态代理的接口)InvocationHandler接口,因为java在接口中提供了八个得以被机关调用的法子invoke,那个以往再说。

2. 先看代码

    private Object object;
            public UserProxy(Object obj){
            this.object = obj;}

这几行代码与静态代理之中在代理类中定义的接口指向实际贯彻类的实例的代码不期而遇,通过这几个布局器能够成立代理类的实例,成立的同时还是能将切实得以达成类的实例与之绑定(object指的正是完结类的实例,那些实例要求在测量试验类中成立并视作参数来成立代理类的实例),达成了静态代理类中private Iuser user = new UserImpl(卡塔尔;大器晚成行代码的功效周围,这里为什么不是同等,而是形似呢,首要便是因为静态代理的那句代码中满含的完结类的实例的创制,而动态代理中达成类的始建须求在测试类中形成,所以那边是看似。

**3. **invoke(Object proxy, Method method, Object[] args)措施,该方法是InvocationHandler接口中定义的不今不古办法,该方法在调用钦命的具体方法时会自动调用。其参数为:代理实例、调用的点子、方法的参数列表
  在此个办法中我们定义了大致和静态代理相似的剧情,仅仅是在点子的调用上分化,差别的原由与早先深入分析的一模二样(创造时机的不及,创立的法门的不等,即反射),Method类是反光机制中二个器重的类,用于封装方法,该类中有二个办法那便是invoke(Object object,Object...args卡塔尔(قطر‎方法,其参数分别表示:所调用方法所属的类的对象和措施的参数列表,这里的参数列表就是从测验类中传送到代办类中的invoke方法八个参数中最终多个参数(调用方法的参数列表)中,在传递到method的invoke方法中的第2个参数中的(此处有个别啰嗦)。

**4. **测验类中的异同
  静态代理中大家测验类中央市直机关接创建代理类的指标,使用代理类的目的来调用其格局就能够,即便其他接口(这里指的是别的调用方)要调用Iuser的章程,也得以动用此法
动态代理中要复杂的多,首先大家要将早先提到的贯彻类的实例创造(补充完整),然后采纳那么些实例作为参数,调用代理来的带参布局器来成立“代理类实例对象”,这里加引号的来头是因为它并非真的的代理类的实例对象,而是制造真正代理类实例的贰个参数,那一个完成了InvocationHandler接口的类严厉意义上的话并非代理类,大家得以将其视作是创办代理类的必备中间环节,那是一个调用项理器,相当于管理办法调用的二个类,不是实介怀义上的代理类,能够那样说:制造一个办法调用项理器实例。
  上面才是确实的代理类实例的开创,早先创建的”代理类实例对象“仅仅是三个参数
    Iuser proxy = (Iuser) Proxy.newProxyInstance(Iuser.class.getClassLoader(), new Class[]{Iuser.class}, h);
  这里运用了动态代理所信赖的第三个基本点类Proxy,此处使用了其静态方法来创造二个代理实例,其参数分别是:类加载器(可为父类的类加载器)、接口数组、方法调用途理器实例
  这里相仿利用了多态,使用接口指向代理类的实例,最后会用该实例来张开具体方法的调用就能够。

接下去我们成立大家的C罗

瑕疵:(1)代理对象的二个接口只服务于黄金年代种等级次序的靶子,若是要代理的主意超多,势须要为每黄金年代种方式都进行代理,静态代理在程序层面稍大时就不可能胜任了。 (2)如若接口扩展一个方法,除了富有达成类要求贯彻那些格局外,全体代理类也急需完成此方法。扩大了代码维护的复杂度。

动态代理优点

动态代理与静态代理相比较,最大的受益是接口中声称的持有办法都被改动来调用场理器一个集聚的方法中管理(InvocationHandler.invoke)。那样,在接口方法数量超级多的时候,大家能够拓宽灵活管理,而无需像静态代理那样每多少个方法举办中间转播。并且动态代理的应用使大家的类任务更纯粹,复用性更加强

class CristianoRonaldo implements ability{ @Override public void footballMatch() { System.out.println("刚刚参加世界杯,准备尤文图斯的比赛"); } @Override public void cR7() { // TODO Auto-generated method stub System.out.println("出息一次商演,赚了1000万英镑"); } @Override public void shopping() { // TODO Auto-generated method stub System.out.println("购买了一台最新生产的液氮治疗机"); } }

动态代理

动态代理在于能够动态的对被代理对象开展情势的动态扩张或许约束。动态代理类的源码是在程序运维时期由JVM依照反射等编写制定动态的扭转,所以空中楼阁代理类的字节码文件。代理类和委托类的涉嫌是在程序运维时规定。

动态代理第生机勃勃基于javaAPI中java.lang.reflect.Proxy 达成,那是java代理体制的父类,它提供了意气风发组static方法方便开荒职员调用。以下为Proxy源码

// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器  
static InvocationHandler getInvocationHandler(Object proxy)   

// 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象  
static Class getProxyClass(ClassLoader loader, Class[] interfaces)   

// 方法 3:该方法用于判断指定类对象是否是一个动态代理类  
static boolean isProxyClass(Class cl)   

// 方法 4:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例  
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

那边最要害的艺术其实newProxyInstance了,从点子名字中大家能够猜出那是用来实例代理对象的方法。这一个措施有五个基本点的参数,第三个是ClassLoader类加载器,那么些能够由此当前类的Class文件举行获取、第三个Class[],即要代理类的接口数组,最终一个是InvocationHandler对象,而最后要的正是以此参数,InvocationHandler 是二个接口,很扎眼这里必要的是其落到实处了,看InvocationHandler 源码大家得以窥见,其接口钦点义了三个方法,大家来探视其源码

public interface InvocationHandler {

    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

经过上述源码我们能够看出,InvocationHandler 接口中独有二个措施invoke,这一个主意相通有五个参数,第三个Object势必是被代理对象,第三个Method则是代理对象所急需周转的主意,第2个则是叁个参数数组,当被代理对象所试行的章程须求参数时,就能够传递至此。现代理对象开展格局调用时,首要透过对invoke方法的重写和扩张使得达到专门的学业须求。先来借用向问天老师一张图

图片 4

调用途理器-InvocationHandler.png

在轻松明白动态代理所需的javaAPI后大家来归纳实现一个案例,此案例,以访问数据库为例

二个代理接口

public interface IUserDao {

    void save() throws InterruptedException;
}

八个代理接口的达成类(委托对象)

public class UserDao implements IUserDao {

    public void save() throws InterruptedException {
        System.out.println("----------save---------");
    }
}

叁个代理对象类(代理对象)

public class DynamicProxy implements InvocationHandler {

    private Object source;

    public DynamicProxy(Object source){
        super();
        this.source = source;
    }

    /**
     * 重写代理方法
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {

        before();

        Object result = method.invoke(source, args);

        after();

        return result;
    }

    public void before(){
        System.out.println("在方法前做一些事,比如打开事务");
    }

    public void after(){
        System.out.println("在方法返回前做一些事,比如提交事务");
    }

    public Object getProxyInstance() {
        //接口的class
        return Proxy.newProxyInstance(getClass().getClassLoader(), source.getClass().getInterfaces(), this);
    }
}

八个测量检验类

public class App {

    @Test
    public void fun1() throws InterruptedException {
        // 目标对象
        IUserDao target = new UserDao();
        // 【原始的类型 class cn.itcast.b_dynamic.UserDao】
        System.out.println(target.getClass());

        // 给目标对象,创建代理对象
        IUserDao proxy = (IUserDao) new DynamicProxy(target).getProxyInstance();
        // class $Proxy0 内存中动态生成的代理对象
        System.out.println(proxy.getClass());

        // 执行方法 【代理对象】
        proxy.save();
    }
    /**
     *  原则:动态代理有一个强制性要求,就是被代理的类必须实现了某一个接口,或者本身就是接口
     *  
     *      道理其实很简单,这是因为动态代理生成的代理类是继承Proxy类的,并且会实现被你传
     *  入newProxyInstance方法的所有接口,所以我们可以将生成的代理强转为任意一个代理的
     *  接口或者Proxy去使用,但是Proxy里面几乎全是静态方法,没有实例方法,所以转换成Proxy
     *  意义不大,几乎没什么用。假设我们的类没有实现任何接口,那么就意味着你只能将生成的代理类转
     *  换成Proxy,那么就算生成了,其实也没什么用,而且就算你传入了接口,可以强转,你也用不了这
     *  个没有实现你传入接口的这个类的方法。
     */
}

图片 5

2017-11-27_194614.png

以上就是三个粗略的动态代理,其余也得以平昔以工厂方法的情势去成立代理,贴上代码就不做过多介绍了,其大旨正是InvocationHandler实例方法invoke的重写。

public class ProxyFactory {

    //维护一个目标对象
    private Object target;
    public ProxyFactory (Object target){
        this.target = target;
    }

    //给目标对象生成代理对象
    public Object getProxyInstance () {
        /**
         * Proxy.newProxyInstance(
         *                      loader,     指定当前目标对象使用类加载器
         *                      interfaces, 目标对象实现的接口的类型
         *                      h           事件处理器
         *                  )
         */
        //这里的Proxy.newProxyInstance即创建了一个代理对象,对象内执行了回调函数
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(), 
                target.getClass().getInterfaces(), 
                //在创建代理对象的时候,其三个参数是一直不变的,第三个参数始终是InvocationHandler
                new InvocationHandler() {

                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        System.out.println("扩展方法执行,如开启事务!");

                        //执行目标对象方法
                        Object returnValue = method.invoke(target, args);

                        System.out.println("扩展方法执行,如关闭事务!");

                        return returnValue;
                    }
                });
    }

}

总结

实质上所谓代理,正是一位依然三个单位表示另壹个人要么另贰个部门选取行动。在部分情况下,一个客商不想仍然不可以预知一贯援引二个指标,而代理对象能够在客商端和对象对象此前起到中介的成效。

代办对象就是把被代理对象包装风度翩翩层,在其里面做一些特别的劳作,比方客户要求上facebook,而见惯不惊互连网不可能直接访问,互联网代理支持客户先翻墙,然后再寻访facebook。那便是代理的法力了。

纵观静态代理与动态代理,它们都能贯彻平等的成效,而作者辈看从静态代理到动态代理的那么些进度,大家会发觉实际动态代理只是对类做了尤其抽象和打包,使其复用性和易用性获得进一层晋级而那不光切合了面向对象的宏图意见,个中还大概有AOP的身材,那也提须求我们对类抽象的生龙活虎种仿照效法。关于动态代理与AOP的关系,个人以为AOP是大器晚成种考虑,而动态代理是风度翩翩种AOP思想的实现!

拓展:
JAVA学习篇--静态代理VS动态代理 - 陈红媛 - CSDN博客
java静态代理与动态代理轻便深入深入分析 - 唯风华正茂浩哥 - 今日头条
Java动态代理与反射详整 - 浩大王 - 今日头条

接下去成立服务于C罗经纪人作为C罗的经纪人当然知道C罗的力量所以要去完结技巧接口,协助C 罗Nardo布署更佳通畅的去做那几个业务

步骤

a. 达成InvocationHandler接口创制和睦的调用场理器
b. 给Proxy类提供ClassLoader和代理接口类型数组创立动态代理类
c. 以调用途理器类型为参数,利用反射机制获得动态代理类的构造函数
d. 以调用项理器对象为参数,利用动态代理类的布局函数成立动态代理类对象

本文由澳门威利斯人发布于网络资讯,转载请注明出处:扩展与约束,利用反射构建动态代理

关键词: 澳门威利斯人 Java Android知识 反射 动态