zoukankan      html  css  js  c++  java
  • Java基础之反射和动态代理

    1,反射是依赖于Class对象,然后根据Class对象,去操作该类的资源的。Class对象是发射的基石!

    问题1:人这类事物用什么表示?汽车这类事物用什么表示》计算机文件用什么表示?有如此多的事物该用什么表示?

    答案:Person类,Car类,File类,这么多的类也是一类事物,这类事物用Class表示。

    问题2:Person类的对象,我们知道代表一个具体的人。那么Class类的对象,又代表什么?

    一个类,在硬盘上表示一个.class文件,JVM启动的时候,把文件加载到内存上,占用一片空间,称为一个字节码文件对象。这个对象就是Class的一个实例。不同的类,有自己的字节码文件对象。这些对象都是Class对象的实例。

    问题3:如何获取一个Class对象呢?

    2,获取Class的三种方式

    获取方式有三种:

    方式1:类名.class

    方式2:对象.class

    方式3:static Class forName(String className)

    三种方式用哪种比较好呢?

    如果是自己玩,用前两种

    如果是开发,用第三种

    三种方式的区别:第三种方式比前两种方式的优势在于:只要类的全名字符串

    ,就可以获取字节码,扩展性好。而前两种:必须有类或对象才能拿到字节码

    3,反射的概念

    反射就是通过一个类的Class对象把类中的各种成员映射成对应的Java类。一个类中的:成员变量、构造函数

    、成员方法都有对应的Java类:Field、Constructor、Method;就比如:一个汽车是一个类,汽车中的发动机、l轮胎等等都可以是一个个的类。一个类的Class对象可以获取其所有成员的信息,比如一个方法的名称、修饰符、参数类型、返回值等等信息封装成一个描述方法的类中。

    4,动态代理

    4.1概念

    动态:我们以前写一个代码,写好后,编译,编译后成class文件。这叫静态。

    在程序的运行过程中,不用写代码,直接在内存中生成一份字节码文件。这叫动态。

    代理:让别人帮我们做事情。

    在刚才的例子中,我们应该专注与Math中相关的:getSum 、 getJC啊这些方法。测试时间这些东西我不应该做,也不想做。我想让别人替我们做。

    在这个过程中,我们不能去修改自己原来的代码。而是动态的生成一个新的类,这个类拥有与MathImpl相同的功能:getSum 、 getJC这些功能。而且要在这些功能的前后,加上计算时间的代码。这个类就叫做动态代理类。

    这个动态生成的类叫做动态代理谁,他代理了谁?MathImpl

    4.2动态生成一个类

    动态生成类:static Class getProxyClass(ClassLoader loader,Class… interfaces)动态生成一个类

    参数1:ClassLoader一个类加载器,随意

    参数2:可变参数,是要代理的类所实现的接口。通过接口,可以知道要代理的类中有哪些方法

    动态代理的原理:我们访问的是代理对象,代理对象去访问了InvocationHandler中的invoke方法。invoke方法是我们写的。我们可以在里面调用代理对象的对应方法。并且可以在调用的前后加自己想要的代码

    4.3动态生成一个对象

    获取代理对象

    static Object newProxyInstance(ClassLoader loader,Class[ ]  interfaces,InvocationHandler h)

  • 相关阅读:
    源码学习之Yii-去掉magic_quote里的反斜线
    PHP中传递回调函数的方法
    mac里的terminal环境下如何跳转行首和行末
    mac下切换输入法
    nginx上配置vhosts
    MySQL学习之查询优化(一)
    MySQL学习之索引(三)
    在LINUX下为自己加上sudo权限的方法
    MySQL学习之索引(二)
    MySQL学习之索引(一)
  • 原文地址:https://www.cnblogs.com/lizhaowen/p/6036571.html
Copyright © 2011-2022 走看看