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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值