反射简介
反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
- 反射提供的功能有:
- 在运行时构造任意一个类的对象
- 在运行时获取对象的包名、类修饰符、属性、构造器、方法、实现的接口、子类、超类等
- 在运行时调用任意对象的任意方法
反射使用
-
获取Class对象:
- 通过
类名.class
,获取对象。 - 通过调用继承自Object对象的
getClass()
方法获取对象。 - 通过
Class.forName(String className)
Class类静态方法className需从包名精确到类,来获取对象。
- 通过
-
通过反射来生成对象主要有两种方式。
- 使用Class对象的newInstance()方法来创建Class对象对应类的实例。
public T newInstance(){}
- 先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。这种方法可以用指定的构造器构造类的实例。
public Constructor<?>[] getConstructors() throws SecurityException {}
- 使用Class对象的newInstance()方法来创建Class对象对应类的实例。
-
获取类构造器的用法与上述获取方法的用法类似。主要是通过Class类的
getConstructor()
方法得到Constructor类的一个实例,而Constructor类有一个newInstance()
方法可以创建一个对象实例:- 使用
Class对象.getConstructor()
方法,获取构造器对象:public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException {}
- 使用
Constructor对象.newInstance()
方法,即所有构造类均可使用此方法创建一个对象实例:
此方法可以根据传入的参数来调用对应的Constructor创建对象实例。public T newInstance(Object ... initargs){}
- 使用
-
获取类对象的属性即成员变量:
Class对象.getFiled(String name)
:访问公有的成员变量public Field getField(String name) throws NoSuchFieldException, SecurityException {}
Class对象.getDeclaredField(String name)
:所有已声明的成员变量,但不能得到其父类的成员变量public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException {}
Class对象.getFileds()
和Class对象.getDeclaredFields()
方法用法:public Field[] getFields() throws SecurityException {}
-
获取某个Class对象的方法集合,主要有以下几个方法:
- 使用
Class对象.getDeclaredMethods()
方法返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。public Method[] getDeclaredMethods() throws SecurityException {}
- 使用
Class对象.getMethods()
方法返回某个类的所有公用(public)方法,包括其继承类的公用方法。public Method[] getMethods() throws SecurityException {}
- 使用
Class对象.getMethod(String name,Class<?>...parameterTypes)
方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象。public Method getMethod(String name, Class<?>... parameterTypes){}
- 使用
-
从类中获取了一个方法后,我们就可以用 invoke() 方法来调用这个方法。invoke方法定义在Method类中:
- 使用
Method对象.invoke()
方法,即所有方法均可使用此方法调用 参数类中的此方法(args为方法参数):public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{}
- 使用
更多:可查看Class类源码,Field类源码,Constructor类源码,Mathod源码、java.lang.reflect下的类等,均与反射有关。