zoukankan      html  css  js  c++  java
  • java反射

    1,java类的加载

    java类的加载是指将.class文件(可能在磁盘,也可能在网络)加载到内存中,并为之生成java.lang.class对象的实例

    java中类以其全限定包名作为唯一标识,jvm中则以全限定包名和类加载器作为唯一标识。

    jvm中的类加载器有三个层次:根类加载器、扩展类加载器、系统类加载器。分别加载核心类,扩展jar包中的类以及classpath等指定的类。

    (这部分的详细只是可以看书)

    2,java反射

    对象具有两种类型:编译时类型和运行时类型。

    2.1 java.lang.class对象的获得方法:

    1) 使用class类的forName(string elazzName);其中,elazzName为全限定包名

    2)调用某个类的class属性,如Person.class

    3)使用某个对象的getclass()方法

    2.2 从class对象中获得信息

    获取构造函数
    1.getConstructor(class<?>... parameterTypes) 
    如 clazz.getConstructor(String.class,Interger.class2.getConstructors()
    3.getDeclaredConstructors()
    同样的方法,可以获得方法,field,注释等等
    反射生成的class对象的相关信息

    2.3 使用反射生成并操作对象

    1)使用class对象的newInstance()方法,此时调用的是默认构造器

    2)使用class对象获取指定的constructor对象,在调用该constructor对象的newInstance()方法,此时可以使用默认的构造器

    这种动态地,根据配置文件创建对象的方法,在大型框架平台经常采用

    2.4调用方法

    1)在利用class对象的getMethods(),getMethod()方法获取method对象

    2)调用method对象的invoke(Object obj,Object.. args)方法进行方法调用

    使用这种方法的时候,会受到java语言访问权限的制约,可以利用setAccessable(boolean flag)方法设定权限可达

    2.5 获取/设置属性值

    1)在利用class对象的getFields(),getField()方法获取Field对象

    2)获取:调用field对象的getXxx(Object obj)或者get()方法进行方法调用

    3)设置:调用field对象的setXxx(Object obj,Xxx val)或者set(Object obj,Object val)方法进行方法调用

    使用这种方法的时候,会受到java语言访问权限的制约,可以利用setAccessable(boolean flag)方法设定权限可达

    java动态代理与AOP(更高一级的解耦,面向切面编程)

    proxy用来创建动态代理,有两种方法:

    1)static class<?> getProxyClass(classLoader loader,class<?> ...interfaces)创建一个动态代理对应的class对象,该代理类将实现interfaces所指定的多个接口,

    2)static Object newProxyInstance(classLoader loader,class<?> ...interfaces,InvocationHandler handler)创建一个动态代理对象,该代理类对象将实现interfaces所指定的多个接口,执行代理对象的每个方法时候都会被替换执行InvocationHandler的invoke方法

    这部分比较糊涂,暂且记得:

    动态代理在AOP中被称为AOP代理,AOP代理可以代替目标对象,包含了目标对象的全部方法,但是AOP代理中的方法与目标对象的方法存在差异,可以在其之前、之后插入一些通用处理。

  • 相关阅读:
    BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)
    BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)
    BZOJ.1014.[JSOI2008]火星人(Splay 二分 Hash)
    BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)
    BZOJ.1011.[HNOI2008]遥远的行星(思路 枚举)
    BZOJ.1013.[JSOI2008]球形空间产生器(高斯消元)
    BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)
    BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)
    BZOJ.1001.[BeiJing2006]狼抓兔子(最小割ISAP)
    BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3898220.html
Copyright © 2011-2022 走看看