首先要求大家对Java泛型知识有所了解,因为程序代码中大量使用了泛型相关知识。
- 动态语言与反射
- Java反射的典型应用
- Java反射常用的对象
- Class<T>
类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
Class是Reflection起源。要想操纵类中的属性和方法,都必须从获取Class object开始。
第一个实例就用大家非常熟悉的ArrayList类,我们尝试来获取ArrayList申明的方法。
public static void main(String[] args) {
ArrayList aList = new ArrayList();
Class alClass = aList.getClass();
System.out.println("①"+alClass);
System.out.println("②"+alClass.getName());
Method[] alMethod = alClass.getDeclaredMethods();
for(Method method : alMethod){
System.out.println("③"+method);
System.out.println("④"+method.getName());
}
}
获取方法 | 说明 | 示例 |
object.getClass()每个对象都有此方法 | 获取指定对象的Class | List list = new ArrayList(); Class listClass = list.getClass(); |
class. getSuperclass() | 获取当前Class的继承类Class | List list = new ArrayList(); Class listClass = list.getClass(); Class superClass = listClass. getSuperclass(); |
Object.class | .class直接获取 | Class listClass = ArrayList.class; |
Class.forName(类名) | 用Class的静态方法,传入类的全称即可 | Class c = Class.forName("java.util.ArrayList"); |
Primitive.TYPE | 基本数据类型的封装类获取Class的方式 | Class longClass = Long.TYPE; Class integerClass = Integer.TYPE; Class voidClass = Void.TYPE; |
Class. newInstance();
Class. getConstructor (new Class[]{}).newInstance(new Object[]{})
clazz. getConstructor(Class<?>... parameterTypes) . newInstance(Object... initargs)
下面看代码实例:
- Method对象--反射方法
- Field 对象--反射属性
- Spring框架的IOC的简化实现
- Java反射总结
只要用到反射,先获得Class Object
没有方法能获得当前类的超类的private方法和属性,你必须通过getSuperclass()找到超类以后再去尝试获得
通常情况即使是当前类,private属性或方法也是不能访问的,你需要设置setAccessible(true)(取消访问安全校验)来取得private的访问权。根据《编写高质量代码:改善Java程序的151个建议》书中介绍,除非一定要控制private安全访问,否则反射时都取消Java的安全访问校验(即设置setAccessible(true)),这样能提高反射性能。
Array对象并未讲解,请下来自己学习