Java反射机制
2013-11-18 19:02
393 查看
http://www.cnblogs.com/keis/archive/2011/03/29/1998736.html
虽然个人不太欣赏这种写文风格,但作者总结的APIs清晰。
笔记:
Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法)。
Class类
类中最重要的三个信息
(1)构造函数
Constructor getConstructor(Class[] params)
Constructor[] getConstructors()
Constructor getDeclaredConstructor(Class[] params)
Constructor[] getDeclaredConstructors()
(2)成员方法
Method getMethod(String name, Class[] params)
Method[] getMethods()
Method getDeclaredMethod(String name, Class[] params)
Method[] getDeclaredMethods()
String name参数,需要写入方法名
(3)成员变量
Field getField(String name)
Field[] getFields()
Field getDeclaredField(String name)
Field[] getDeclaredFields()
String name参数,需要写入变量名
类中重要的三个相关类
(1)Constructor类
这个类有一个public成员函数,T newInstance(Object... args),其中args为对应的参数。
(2) Method类
此类有一个public成员函数,Object invoke(Object receiver, Object... args)。第二个参数args代表这个方法所需要接收的参数。第一个参数指明调用对象。如果某个方法是Java类的静态方法,那么Object receiver参数可以传入null,因为静态方法不从属于对象。
(3)Field类
Object get(Object object)
void set(Object object, Object value)
object参数是需要传入的对象,原理类似于成员方法需要指明对象一样。如果是静态属性,此值同样可以为null。
AccessibleObject
Field、Method和Constructor类,它们都有一个共同的父类AccessibleObject 。AccessibleObject 有一个公共方法:void setAccessible(boolean flag)。正是这个方法,让我们可以改变动态的打开或者关闭访问安全检查,从而访问到原本是private的方法或域。
虽然个人不太欣赏这种写文风格,但作者总结的APIs清晰。
笔记:
Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法)。
Class类
Class object 诞生管道 | 示例 |
运用getClass() 注:每个class 都有此函数 | String str = "abc"; Class c1 = str.getClass(); |
运用 Class.getSuperclass() | Button b = new Button(); Class c1 = b.getClass(); Class c2 = c1.getSuperclass(); |
运用static method Class.forName() (最常被使用) | Class c1 = Class.forName ("java.lang.String"); Class c2 = Class.forName ("java.awt.Button"); Class c3 = Class.forName ("java.util.LinkedList$Entry"); Class c4 = Class.forName ("I"); Class c5 = Class.forName ("[I"); |
运用 .class 语法 | Class c1 = String.class; Class c2 = java.awt.Button.class; Class c3 = Main.InnerClass.class; Class c4 = int.class; Class c5 = int[].class; |
运用 primitive wrapper classes 的TYPE 语法 | Class c1 = Boolean.TYPE; Class c2 = Byte.TYPE; Class c3 = Character.TYPE; Class c4 = Short.TYPE; Class c5 = Integer.TYPE; Class c6 = Long.TYPE; Class c7 = Float.TYPE; Class c8 = Double.TYPE; Class c9 = Void.TYPE; |
(1)构造函数
Constructor getConstructor(Class[] params)
Constructor[] getConstructors()
Constructor getDeclaredConstructor(Class[] params)
Constructor[] getDeclaredConstructors()
(2)成员方法
Method getMethod(String name, Class[] params)
Method[] getMethods()
Method getDeclaredMethod(String name, Class[] params)
Method[] getDeclaredMethods()
String name参数,需要写入方法名
(3)成员变量
Field getField(String name)
Field[] getFields()
Field getDeclaredField(String name)
Field[] getDeclaredFields()
String name参数,需要写入变量名
类中重要的三个相关类
(1)Constructor类
这个类有一个public成员函数,T newInstance(Object... args),其中args为对应的参数。
(2) Method类
此类有一个public成员函数,Object invoke(Object receiver, Object... args)。第二个参数args代表这个方法所需要接收的参数。第一个参数指明调用对象。如果某个方法是Java类的静态方法,那么Object receiver参数可以传入null,因为静态方法不从属于对象。
(3)Field类
Object get(Object object)
void set(Object object, Object value)
object参数是需要传入的对象,原理类似于成员方法需要指明对象一样。如果是静态属性,此值同样可以为null。
AccessibleObject
Field、Method和Constructor类,它们都有一个共同的父类AccessibleObject 。AccessibleObject 有一个公共方法:void setAccessible(boolean flag)。正是这个方法,让我们可以改变动态的打开或者关闭访问安全检查,从而访问到原本是private的方法或域。
相关文章推荐
- Java反射机制深入详解
- Java反射机制详解
- Java反射机制详解
- Java反射机制
- java反射机制的原理与应用
- 实战java反射机制-让你迅速认识java强大的反射机制
- java反射机制详解 及 Method.invoke解释
- Java反射机制详解
- JAVA的newInstance()和new的区别(JAVA反射机制,通过类名来获取该类的实例化对象)
- Java反射机制==>运行时使用反射分析对象
- java反射机制
- Java反射机制
- 老生常谈Java反射机制(必看篇)
- 你需要理解的Java反射机制知识总结
- 一个例子让你了解Java反射机制
- Java反射机制在Spring IOC中的应用
- Java反射机制
- 使用Java反射机制创建对象
- 你需要理解的Java反射机制知识总结
- Java反射机制demo(七)—反射机制与工厂模式