1、反射相关的主要API
java.lang.Class
:
代表一个类
java.lang.reflect.Method:
代表类的方法
java.lang.reflect.Field:
代表类的成员变量
java.lang.reflect.Constructor:
代表类的构造器
… …
2、Class类的常用方法
方法名 功能说明
static Class forName(String name) 返回指定类名 name
的
Class
对象
Object newInstance() 调用缺省构造函数,返回该Class对象的一个实例
getName() 返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称
Class getSuperClass() 返回当前Class对象的父类的Class
对象
Class [] getInterfaces() 获取当前Class对象的接口
ClassLoader getClassLoader() 返回该类的类加载器
Class getSuperclass() 返回表示此Class所表示的实体的超类的
Class
Constructor[] getConstructors() 返回一个包含某些Constructor
对象的数组
Field[] getDeclaredFields() 返回Field对象的一个数组
Method getMethod(String name,Class … paramTypes) 返回一个Method对象,此对象的形参类型为
paramType
3、获取Class类的实例(四种方法)
1
)
前提:
若已知具体的类,通过类的
class
属性获取,该方法最为安全可靠,程序性能最高
实例:
Class clazz = String.class;
2
)
前提:
已知某个类的实例,调用该实例的
getClass()
方法获取
Class
对象
实例:
Class clazz = “www.atguigu.com”.getClass();
3
)
前提:
已知一个类的全类名,且该类在类路径下,可通过
Class
类的静态方法forName()
获取,可能抛出
ClassNotFoundException
实例:
Class clazz = Class.forName(“java.lang.String”);
4
)其他方式
ClassLoader cl = this.getClass().getClassLoader();
Class clazz4 = cl.loadClass(“
类的全类名
”);
关于类加载器的一个主要方法:
getResourceAsStream(String str):
获取类路径下的指定文件的输入流
•
InputStream in = null;
•
in = this.getClass().getClassLoader().getResourceAsStream("exer2\\test.properties");
4、创建运行时类的对象
创建类的对象:
调用
Class
对象的
newInstance()
方法
要 求: 1
)类必须有一个无参数的构造器。
2)类的构造器的访问权限需要足够。
5、获取运行时类的完整结构
1).
实现的全部接口
public Class<?>[] getInterfaces()
确定此对象所表示的类或接口实现的接口。
2.
所继承的父类
public Class<? Super T> getSuperclass()
返回表示此
Class
所表示的实体(类、接口、基本类型)的父类的Class。
3).
全部的构造器
public Constructor<T>[] getConstructors()
返回此
Class
对象所表示的类的所有
public
构造方法。
public Constructor<T>[] getDeclaredConstructors()
返回此
Class
对象表示的类声明的所有构造方法。
Constructor
类中:
取得修饰符
:
public int getModifiers();
取得方法名称
:
public String getName();
取得参数的类型:
public Class<?>[] getParameterTypes();
4).
全部的方法
public Method[] getDeclaredMethods()
返回此
Class
对象所表示的类或接口的全部方法
public Method[] getMethods()
返回此
Class
对象所表示的类或接口的
public
的方法
Method
类中:
public Class<?> getReturnType()
取得全部的返回值
public Class<?>[] getParameterTypes()
取得全部的参数
public int getModifiers()
取得修饰符
public Class<?>[] getExceptionTypes()
取得异常信息
5).
全部的
Field
public Field[] getFields()
返回此
Class
对象所表示的类或接口的
public
的
Field
。
public Field[] getDeclaredFields()
返回此
Class
对象所表示的类或接口的全部
Field
。
Field
方法中:
public int getModifiers()
以整数形式返回此
Field
的修饰符
public Class<?> getType()
得到
Field
的属性类型
public String getName()
返回
Field
的名称。
6). Annotation
相关
get Annotation(Class<T> annotationClass)
getDeclaredAnnotations
()
7).
泛型相关
获取父类泛型类型:
Type getGenericSuperclass()
泛型类型:
ParameterizedType
获取实际的泛型类型参数数组:
getActualTypeArguments()
8).
类所在的包
Package getPackage()
6、调用运行时类的指定结构
6.1、调用指定方法
通过反射,调用类中的方法,通过
Method
类完成。步骤:
1.
通过
Class
类的
getMethod(String name,Class…parameterTypes)
方法取得一个Method
对象,并设置此方法操作时所需要的参数类型。
2.
之后使用
Object invoke(Object obj, Object[] args)
进行调用,并向方法中传递要设置的obj
对象的参数信息。
Object invoke(Object obj, Object … args)
说明:
1).Object
对应原方法的返回值,若原方法无返回值,此时返回
null
2).
若原方法若为静态方法,此时形参
Object obj
可为
null
3).
若原方法形参列表为空,则
Object[] args
为
null
4).
若原方法声明为
private,
则需要在调用此
invoke()
方法前,显式调用方法对象的setAccessible(true)
方法,将可访问
private
的方法。
6.2、调用指定属性
在反射机制中,可以直接通过
Field
类操作类中的属性,通过
Field
类提供的
set()
和get()方法就可以完成设置和取得属性内容的操作。
public Field getField(String name)
返回此
Class
对象表示的类或接口的指定的public的
Field
。
public Field getDeclaredField(String name)
返回此
Class
对象表示的类或接口的指定的Field
。
在
Field
中:
public Object get(Object obj)
取得指定对象
obj
上此
Field
的属性内容
public void set(Object obj,Object value)
设置指定对象
obj
上此
Field
的属性内容
7、动态代理