Java 反射 java.lang.reflect包


关键一:包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方法
    方法二:调用指定的构造器创建运行时类的对象
  • 可以获取对应的运行时类的完整结构
    如属性,方法,构造方法,包,父类,接口,内部类等等
  • 可以调用对应的运行时类的指定结构
    (如指定的属性,方法,构造方法)
  • 动态代码
    反射的应用,体会反射的动态性。


关键一:包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方法
    方法二:调用指定的构造器创建运行时类的对象
  • 可以获取对应的运行时类的完整结构
    如属性,方法,构造方法,包,父类,接口,内部类等等
  • 可以调用对应的运行时类的指定结构
    (如指定的属性,方法,构造方法)
  • 动态代码
    反射的应用,体会反射的动态性。

猜你喜欢

转载自blog.csdn.net/Jone__/article/details/73468839