目录
学习代码
https://github.com/starrQWQ/java_code/tree/master/javaSE基础
反射(reflect)是三大框架的基础,它要用到:
java.lang.Class<T>
以及java.lang.reflect子包的几个重点类:
- Constructor
- Field
- Method
- Modifier修饰符
它们代表类的元素
反射作用:
- 反编译
- 访问java对象的Constructor,Field,Method。
获取class类型对象的3种方式:
- Class.forName()
- 类名.class
- Object引用.getClass()
forName()会把类装载到虚拟机里
类名.class不会
获取Class类型对象后,可以创建该类型对象。
T newInstance()调用无参数构造方法。
所以想使用该方法必须有无参数构造方法。
关于可变长参数:
只能出现一次且出现在形参的最后一个。
m1(int a,int... b){}
关于 IO、Properties和reflect
3步:
创建属性对象
创建流
load()
配置文件使程序更加灵活
像dbinfo这样的配置文件又叫属性文件,一般后缀".properties"
中文要用unicode存储
key和value可以用“ ”“:”“=”连接
反编译Field
Class引用.getFields()获取public修饰的属性
Class引用.getDeclaredFields()获取所有属性
getModifiers()
getType()
getName() & getSimpleName()
属性靠名字区分
Field getDeclaredField(String name)获取某个特定属性
然后就可以修改这个值
void set(Object obj, Object value)
对于私有属性
Field父类:java.lang.reflect.AccessibleObject
void setAccessible(boolean flag)
打破封装访问,但不安全。
反编译Method
和Field的区别在于获取某个特定的方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Object Method引用.invoke(Object obj, Object... args)
反编译Constructor
区别也在于获取某个特定的方法
Constructor有一个创建方法
T newInstance(Object... initargs)
反编译父类和父接口
Class<?>[] getInterfaces()
Class<? super T> getSuperclass()
反射缺点:
打破封装
效率低(相对 new)
反射相当于一种解释操作