反射

作者: 飞马_6886 | 来源:发表于2019-06-29 18:22 被阅读0次

反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。 反射是Java被视为动态语言的关键。

Java万事万物皆对象,我们声明的类都被虚拟机视为对象,Class, Method,Field ,Constructor
class封装了对应当前类的信息。

使用场景:

使用各种框架时,不能实例化对象。

三种方法获取Class

Servant servant = new Servant();
//第一种方法   简单安全,不需要try~catch,  动态块 静态块 构造方法均不执行。
Class cls = servant.class;
//第二种方法   会执行静态块 动态块,构造方法。
Class cls1 = class.getClass();
//第三种方法    包名 +类名  需要try~catch, 会执行静态块,
Class  cls2 = Class.forName("com.package.name.Servant");
cls.newInstance

类加载器

类加载器

获取构造方法

Class<Person>  clazz = Class.forName(" className");
Constructor<Person>[]  constructors = (Constructor<Peron>[]) class.getConstructors();
for(Constructor<Person> construcot : contructors){
     //  参数与构造方法类型一致,基本类型要用int.class double.class 等等。
      construct.getConstructor(String.class,int.class); 
      Person person = constructor.newInstance("Tom",18);

}

Method[]  method =  clazz.getMethods();  //获取所有的方法,包括父类方法 。但是不能获取私有方法

Method[] methods = clazz.getDeclaredMethods(); //获取所有声明的方法,不包括父类方法。
// 可以获取指定的方法,包括私有方法。
Method method = clazz.getDeclaredMethods("methodName",String.class); 
Method setAge = clazz.getDeclaredMethods("setAge",int.class);
//调用方法
Object obj = clazz.newInstance();
method.invoke(obj,"Mark");
setAge.invoke(obj,18);
//执行私有方法时:method.setAccessible(true);
method.setAccessible(true);
method.invoke(obj);


获取成员变量 属性

Field[]  fields = clazz.getDeclaredFields(); //获取所有的字段,不能获取父类字段
for(Field field: fields){
      System.out.println(field.getName());
}

//获取指定字段: 要传入字段的名称
Field field  = Clazz.getDeclaredField("name");

//设置变量  ----要指定对象 指定对象的值
Person person = new Person("Mar",18);
Object val = field.get(person);
field.set(person,"Tom");   

//字段是私有的 读或写 前要调用 field.setAccessible(true);
Field age = clazz.getDeclaredField("age");
age.setAccessible(true);

相关文章

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • Java反射

    什么是反射? 反射的作用? 反射性能优化?

  • 反射三定律

    反射第一定律:反射可以将interface类型变量转换成反射对象 反射第二定律:反射可以将反射对象还原成inter...

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

  • 一周岁前做好两件事,孩子就不会语言迟缓,保证口齿伶俐

    与语言发展相关的原始反射有四个:张口反射、足跖反射、抓握反射和手拉反射,每个反射的发生、发展和整合都是次第进行的,...

  • 面试官问go反射第一弹

    目录 反射概念 reflect包 反射类型(Type)和种类(Kind) 反射类型(Type)使用 反射类型对象(...

网友评论

    本文标题:反射

    本文链接:https://www.haomeiwen.com/subject/pnmpcctx.html