博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java反射
阅读量:4914 次
发布时间:2019-06-11

本文共 1304 字,大约阅读时间需要 4 分钟。

一、Class类

1. 我们创建的类也是对象,即类本身是java.lang.Class类的实例对象

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()方法

 

转载于:https://www.cnblogs.com/june0816/p/6774529.html

你可能感兴趣的文章
SD卡调试关键点
查看>>
Hadoop HBase Phoenix 版本
查看>>
深入Java集合学习系列:ConcurrentHashSet简单实现
查看>>
[原创]独立模式安装Hive
查看>>
最长公共上升子序列||LCIS
查看>>
本周ASP.NET英文技术文章推荐[12/17 - 12/23]
查看>>
c++虚函数注意事项
查看>>
翻译qmake文档(四) Building Common Project Types
查看>>
【转】nginx 服务器安装及配置文件详解
查看>>
oracle 函数用法
查看>>
.Net中的水晶报表
查看>>
Android按钮的四种点击事件
查看>>
【Datastage】函数大全
查看>>
读书笔记三
查看>>
Qt解决中文乱码
查看>>
【语言处理与Python】2.1获取文本语料库
查看>>
048-PHP定义常量
查看>>
##管家婆项目(一)
查看>>
LeetCode-64. 最小路径和
查看>>
Python Homework 001
查看>>