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

    一、Class类

    1. 我们创建的类也是对象,类对象 vs 实例对象

    2. java.lang.Class类的构造方法是私有的,所以类不需要new出来

    3. java.lang.Class类的实例对象有三种表示方式:

    Class<?> c=A.class;  // 任何一个类都有一个隐藏的静态成员变量class

    Class<?> c=a.getClass();  // 已知该类的对象,获取类

    Class<?> c=Class.forName("类的全名")

    4. 可以通过得到的Class类对象可以创建实例的对象

    A a=(A)c.newInstance();

    二、类加载的两种方式

    1. 用new去创建对象的类,是静态加载类,编译时就需要加载所有可能使用到的类

    2. 用Class<?> c=Class.forName("类的全名")得到的类,是动态加载类,运行时才会加载

    三、获取类型信息和Class类的基本API

    1. 获取类型:Class c=String.class;

    2. c.getName();

    3. Method[] m=c.getMethods();  m.invoke();

    4. Field[] f=c.getDelaredFields();

    四、集合泛型的本质

    1. 集合中的泛型,是用于防止错误类型的元素输入的,只在编译阶段有效

    2. 在编译之后运行期间,JVM会将集合中的对象都看作基类,而对象的实际类型信息就丢失了,即泛型擦除

    3. 所以用反射可以在泛型集合中加入类型不对的元素,例如List<String>中,加入add(1),就可以在一个list里存储多种不同的类型

    五、使用场景

    1. 反射构建出无法直接访问的类

    2. set/get到无法访问的类变量

    3. 调用不可访问的方法

    六、代码

    Proxy target=new Proxy();
    Method method=Proxy.class.getDeclaredMethod("abc");
    method.invoke(target);

    七、getDeclaredMethod原理

    1. getDeclaredMethod(),先使用privateGetDeclaredMethods()方法从缓存或者JVM里获取Class中的方法列表

    2. privateGetDeclaredMethods使用searchMethods()方法,从方法列表里找到一个匹配的方法对象

    3. 如果找到匹配的method,重新拷贝一份返回,Method.copy()

    4. 所以每次调用getDeclaredMethod()方法,返回的Method对象都是一个新的对象

    5. 如果需要频繁调用,最好把返回的Method对象缓存起来

    八、invoke原理

    1. 通过acquireMethodAccessor()方法生成MethodAccessor对象

    2. 调用MethodAccessor对象的invoke()方法

  • 相关阅读:
    Eclipse插件
    Android res文件夹下新建layout文件夹出错:invalid resource directory name
    Java笔记一:斐波那契数列
    Android应用的启动界面
    android短信系列之实现发送短信,并获得发送报告与接收报告
    转:android 使用html5作布局文件
    ubuntu10.10 全自动安装微软雅黑字体
    gcswf32.dll已停用
    Android连接真机之中兴
    在Servlet中连接Access
  • 原文地址:https://www.cnblogs.com/june0816/p/6774529.html
Copyright © 2011-2022 走看看