关键一:包java.lang.reflect
在java的java.lang.reflect包中提供了对该功能的支持。
我可以查看java.lang.reflect包,可以看到下面几个关键的类:
关键类 | 说明 |
---|---|
Constructor-构造类 | This class represents a constructor. |
Field-属性类 | This class represents a field. |
Method-方法类 | This class represents a method. |
Modifier-修饰符类 | This class provides static methods to decode class and member modifiers. |
关键二:类java.lang.Class
而reflect的源头是java.lang.Class类,Class类是reflect的总导演,所有java类都继承Object类,在Object类中有getClass()方法,该方法返回一个类型为Class的对象。如代码:
Class c = persion.getClass();//persion为类Persion的一个对象
- 1
- 1
java.lang.Class类的几个关键方法:
关键方法 | 说明 |
---|---|
getPackage() | 返回包的路径 |
getName() | 返回类的名称 |
getSuperclass() | 返回父类 |
getInterfaces() | 返回其实现的接口 |
getConstructors() | 返回其所有的public构造方法 |
getConstructors(Class… parameterTypes) | 返回其指定参数的public构造方法 |
getDeclaredConstructors() | 返回其所有声明的构造方法,包括private构造方法 |
getDeclaredConstructors(Class… parameterTypes) | 返回其指定参数的构造方法,包括private构造方法 |
getMethods() | 返回其所有的public的方法,包括其父类的public方法 |
getMethod(String name, Class… parameterTypes) | 返回其指定的public的方法 |
getDeclaredFields() | 返回其声明的所有的方法,包括private类型的方法 |
getDeclaredMethod(String name, Class… parameterTypes) | 返回其指定参数的方法,包括private类型的方法 |
getFields() | 返回其所有的public属性,包括其父类的public属性 |
getField(String name) | 返回其指定的public属性,包括其父类的public属性 |
getDeclaredFields() | 返回其声明的所有的属性,包括其private类型的属性 |
getDeclaredField(String name) | 返回其指定的属性,包括其private类型的属性 |
getClasses() | 返回其public的内部类 |
getDeclaredClasses() | 返回其所有的内部类,包括private类型的内部类 |
关键三:类Constructor
—–java.lang.reflect.Constructor
访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。如:
c.getDeclaredConstructor(String.class,int.class);
c.getDeclaredConstructor(new Class[]{String.class,int.class});
- 1
- 2
- 1
- 2
Constructor类的常用方法:
关键方法 | 说明 |
---|---|
isVarArgs() | 查看该构造方法是否带有可变数量的参数 |
getParameterTypes() | 返回构造方法的参数列表 |
getExceptionTypes() | 返回构造方法的异常列表 |
newInstance(Object… args) | 返回该构造方法创建的类的对象 |
setAccessible(boolean flag) | 让private类型的构造方法可以创建类的对象 |
getModifiers() | 返回构造方法的类型 |
关键四:类Field
—–java.lang.reflect.Field
访问指定的属性,需要根据该属性的名称来访问。如:
c.getDeclaredField("name_field");
Field类的常用方法:
关键方法 | 说明 |
---|---|
getName() | 返回成员变量的名称 |
getType() | 返回成员变量的类型 |
get(Object object) | 返回指定对象object的成员变量的值 |
set(Object object, Object value) | 给指定对象object的成员变量设置value值 |
setAccessible(boolean flag) | 让private类型的成员变量拥有public权限 |
getModifiers() | 返回成员变量的类型 |
关键五:类Method
—– java.lang.reflect.Method
访问指定的方法,需要根据该方法的名称和入口参数的类型来访问。如:
c.getDeclaredMethod("method_name",String.class,int.class);
c.getDeclaredMethod("method_name",new Class[]{String.class,int.class});
1
- 2
Method类的常用方法:
关键方法 | 说明 |
---|---|
getName() | 返回该方法的名称 |
getParameterTypes() | 返回方法的参数列表 |
getReturnType() | 返回该方法的返回值类型 |
getExceptionTypes() | 返回方法的异常列表 |
getModifiers() | 返回方法的类型 |
isVarArgs() | 查看该方法是否带有可变数量的参数 |
invoke(Object receiver, Object… args) | 用入口参数来调用指定对象的方法 |
setAccessible(boolean flag) | 让private类型的方法拥有public权限 |
reflect的作用
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类的完整结构
如属性,方法,构造方法,父类等等 - 在运行时调用任意一个类的对象的属性和方法
- 生成动态代理
reflect的详细使用指南
创建对应的Class实例
java.lang.Class 反射的源头,反射涉及到的类都在java.lang.reflect目录下,如Field,Method,ConstructorType等等。
实例化Class的方法(4种方法):
- 调用运行时类的.class属性
c = Persion.class;
System.out.println("方法一 : 调用运行时类的.class属性: "+c.toString());
- 通过运行时类的对象,调用getClass()方法
c = persion.getClass();
System.out.println("方法二 : 通过运行时类的对象,调用getClass()方法: "+c.toString());
- 调用Class的静态方法forName(String className)
c = Class.forName(Persion.class.getName().toString());
System.out.println("方法三 : 调用Class的静态方法forName(String className): "+c.toString());
- 通过类的加载器
//ClassLoader classLoader = this.getClass().getClassLoader();
ClassLoader classLoader = Persion.class.getClassLoader();
c = classLoader.loadClass(className);
System.out.println("方法四:通过类的加载器: "+c.toString());
有了Class实例之后,可以做什么?
- 可以创建对应的运行时类的对象
方法一:调用Class的newInstance方法
方法二:调用指定的构造器创建运行时类的对象 - 可以获取对应的运行时类的完整结构
如属性,方法,构造方法,包,父类,接口,内部类等等 - 可以调用对应的运行时类的指定结构
(如指定的属性,方法,构造方法) - 动态代码
反射的应用,体会反射的动态性。