title: Java反射
tags:
- java
copyright: true
comments: true
toc: true
date: 2013-03-23 15:41:51
categories: java
password:
来源视频: https://www.imooc.com/video/3725
Class类的使用
- 在面向对象的世界中,万事万物皆对象。Java中,只有静态的成员和普通数据类型(但是有包装对象)不是对象;
- Class类是java.lang.Class类的实例对象(There is a class named Class),其构造方法为私有的,只有JVM可以调用
- 基本数据类型、void都存在类类型,如:Class c1=void.class,Class c2=int.class
- 任何类都是Class的实例对象,这个实例对象有(如:Food类)3种表现方式:
1 | Food food1 = new Food();//Food这个类是Class类的实例对象 |
动态加载类:Class类
- Class.forName(“类的全称”);不仅表示了类的类类型,还表示了动态加载类
- 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类
- new创建对象时,是静态加载类,在编译时就需要加载所有可能用到的类
反射的操作流程
- 获取类的类类型
- 通过类的类类型获取方法、属性等相关信息
方法的反射
1 | //获取类的类类型 |
成员变量的反射
1 | //获取类的类类型 |
构造函数的反射
构造方法获取类似:
1 | c.getDeclaredConstructors();//得到所有构造函数 |
方法反射的基本操作
- 方法的名称和方法的参数列表才能唯一决定某个方法
- method.invoke(对象,参数列表 ),如:
1 | //获取方法对象 |
集合范型的本质
- 反射的操作都是编译之后的操作
- 编译之后集合的范型是去范型化的,Java中集合的范型是防止错误输入的,只在编译阶段有效,可以通过反射的操作来绕过编译,如:
1 | List<String> list = new ArrayList<String>(); |