Java反射机制总结
来源:互联网 发布:js中播放器代码 编辑:程序博客网 时间:2024/04/28 21:35
当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化,3个步骤来对该类进行初始化。
类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象。系统中的所有类实际上都是java.lang.Class的实例。
在Java中获得Class对象通常有如下3种方式:
1. 使用Class.forName(String clazzName)静态方法。该字符串参数的值是某个类的全限定类名(必须添加完整包名)。
2. 调用类的class属性获取该类对应的Class对象。例如MainActivity.class。
3. 调用对象的getClass()方法。该方法是java.lang.Object类中的一个方法,所以所有的Java对象都可以调用该方法,该方法将会返回该对象所属类对应的Class对象。
第2种方式有如下优势:
1. 代码更安全。程序在编译阶段可以检查需要访问的Class对象是否存在。
2. 程序性能更好。
Java反射机制就是通过类对应的Class对象在运行时获取类的信息,如类构造方法、方法、成员变量、注解、内部类、外部类、接口、超类Class对象、修饰符、包、类名。
Class类的方法
1. 获取构造方法
// 返回此Class对象对应类的指定public构造器Constructor<T> getConstructor(Class<?>... parameterType); // 返回此Class对象对应类的所有public构造器Constructor<T>[] getConstructors();// 返回此Class对象对应类的指定构造器,与构造器访问权限无关getDeclaredConstructor(Class<?>... parameterType);// 返回此Class对象对应类的所有构造器,与构造器访问权限无关getDeclaredConstructors();
2. 获取方法
Method getMethod(String name, Class<?>... parameterTypes);Method[] getMethods();// 返回此Class对象对应类的指定方法,与方法的访问权限无关Method getDeclaredMethod(Strinig name, Class<?>... parameterTypes); Method getDeclaredMethods();
3. 获取Field
Field getField(String name);Field[] getFields();Field getDeclaredField(String name);Field[] getDeclaredFields();
通过上述方法可以获取非public Method和非public Field,使用方法java.lang.reflect.AccessibleObject.setAccessible(boolean flag)
将该Field或Method设置为可访问,这样就可以访问非public方法。
4. 获取Annotation
<A extends Annotation> A get getAnnotation(Class<A> annotationClass);Annotation[] getAnnotations();Annotation[] getDeclaredAnnotations();
Java很多的开发框架都是用了Java注解,Java的反射机制则为这些框架实现提供了基础。
5. 创建对象
T newInstance(); 相当于使用无参构造器new一个对象,若无参构造器不可访问,则抛出IllegalAccessException异常,若没有无参构造器,则抛出InstantiationException异常。
- Java反射机制总结
- java反射机制总结
- Java反射机制总结
- Java 反射机制总结
- Java反射机制总结
- java反射机制总结
- Java反射机制总结
- JAVA反射机制总结
- java反射机制总结
- Java反射机制总结
- Java反射机制总结
- Java反射机制总结
- java反射机制学习总结
- java反射机制总结(一)
- java反射机制归纳总结
- Java 反射机制简单总结
- java反射机制学习总结
- java反射机制学习总结
- ios中获得UUID的方法
- spring 动态代理
- intelij idea 使用熟悉积累
- KMP字符串匹配算法实现
- JNI介绍及借助Dev生成dll文件的实例
- Java反射机制总结
- ecshop 模版中直接写php源码 分类id如何获得
- 【FAQ】MySQL解决PacketTooBigException问题
- 对逻辑斯蒂回归的一些细节剖析
- linux下常用的37条Shell命令
- POJ 2241 The Tower of Babylon(dp)
- SqlServer之基本增删改查(2)
- __new__方法和__init__方法
- Struts2 标签定义变量及for循环