java反射机制梳理

java反射机制梳理

Java反射简介
  • 反射简介
    • 编译和运行
      • 编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
    • 要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载。Java类如果不被Java虚拟机加载,是不能正常运行的。现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了。Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用在编译期并不知道的类。
    • Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
    • Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
  • java反射有什么用
    • 假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。
  • 得到反射的三种方法
    • 类.class;
    • 对象.getClass();
    • Class.forName("类的全称"),不仅表示了,类的类类型,还代表了动态加载类
    • 三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。
  • 一个类里都有什么
    • 类名、类修饰符、包信息、父类、实现的接口、属性、方法、构造器(构造方法)、注解多部分组成。
  • 属性有几部分组成
    • 修饰符、类型、属性名、属性值四部分组成。
  • 方法有几部分组成
    • 修饰符、返回类型、方法名、参数列表、方法体、返回值
  • 构造器有几部分组成
    • 修饰符、构造器名称(类名)、参数列表、方法体

      java.lang.Class类
  • java.lang.Class类介绍
    • 要正确使用Java反射机制就得使用java.lang.Class这个类。它是Java反射机制的起源。当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。 
    • Class没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的。
    • 类是对象,类是java.lang.Class类的实例对象

      反射的演示
Class clazz = Class.forName("fanshe.Student");
"*******************************构造方法*******************************"
Constructor[] conArray = clazz.getConstructors();  //所有公有构造方法
conArray = clazz.getDeclaredConstructors();        //所有的构造方法(包括:私有、受保护、默认、公有)
Constructor con = clazz.getConstructor(null);      //获取私有构造方法,并调用
con.setAccessible(true);//暴力访问(忽略掉访问修饰符)
obj = con.newInstance('男');  //构造函数调用



"*******************************成员变量*******************************"
Field[] fieldArray = stuClass.getFields();  //获取所有公有的字段
fieldArray = stuClass.getDeclaredFields();  //获取所有的字段(包括私有、受保护、默认的)
Field f = stuClass.getField("name");        // 获取公有字段name

Object obj = stuClass.getConstructor().newInstance();  //字段调用:实例  赋值  调用
f.set(obj, "刘德华");//为Student对象中的name属性赋值
Student stu = (Student)obj;
System.out.println("验证姓名:" + stu.name);




"*******************************成员方法*******************************"
Class stuClass = Class.forName("fanshe.method.Student");
stuClass.getMethods();    //获取所有的”公有“方法
methodArray = stuClass.getDeclaredMethods();    //获取所有的方法,包括私有的
Method m = stuClass.getMethod("show1", String.class);  //获取公有的show1()方法

Method m = stuClass.getDeclaredMethod("show4", int.class);  //获取私有的show4()方法并调用
m.setAccessible(true);//解除私有限定
Object result = m.invoke(obj, 20);  //调用

猜你喜欢

转载自www.cnblogs.com/frankltf/p/9758764.html