Java反射

反射(框架设计的灵魂)

定义:

Java反射机制是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的属性和方法。这种动态获取信息以及动态调用方法的功能称为Java语言的反射机制。
-------------------------------------------------------------------------------------
为了帮助大家理解我们简单了解一下Java代码在计算机的执行过程概述,这里我把它分为三个阶段。
1. 源代码阶段:我们写的Java文件 如xxx.java 被编译器(javac)编译以后 会在硬盘上生产一个xxx.class 字节码文件。
2. Class类对象阶段:我们通过类加载器把xxx.class加载到内存中。内存中有一个Class类对象来描述字节码文件。
一个类主要有三部分 成员变量 构造方法 成员方法
所以我们把这三部分封装成一个对象,Class类对象。
Field[] --------成员变量 Constructor[] --------构造方法 Method[]--------成员方法
4. 运行时阶段:new 一个对象
反射可以是说将各个类封装成一个class对象,可以再程序运行中操作这些对象。

获取Class类对象的3种方式:

1.Class.forName(“全类名”); 源代码阶段 我们代码并没有进内存 我们通过Class.forName() 方法 将字节码文件加载到内存
2.类名.class Classl类对象阶段 我们通过类名.class获取
3.对象.getclass(); 运行时阶段 已经存在对象 通过对象.getclass 获取class对象

package com.example.demo.test;
public class Demo {

    public static void main(String[] args) throws ClassNotFoundException {
        //获取class的三种方式
        //1.Class.forName("全类名");
        Class<?> clazz1 = Class.forName("com.example.demo.test.Demo");
        //2.类名.class 
        Class<Demo> clazz2 = Demo.class;
        //3.对象.getclass();
        Demo demo = new Demo();
        Class<? extends Demo> clazz3 = demo.getClass();
    }
}

如果比较这三个对象 class1 == class2 class2==class3 是true还是false呢
结果都是true 证明这三个不同的引用指向的是堆内存中同一个对象
所以 同一个字节码文件(*.class文件)在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的class对象都是同一个。

class对象功能

1.获取成员变量
Filed[] getFields(); 获取所有public修饰的成员变量
Filed[] getField(String name); 获取指定public修饰的成员变量
Filed[] getDeclaredFields() 获取所有成员变量
Filed[] getDeclaredField(String name) 获取指定成员变量
2.获取构造方法
Constructor[] getConstructors() 获取所有构造方法
Constructor getConstructor(Class… parameterTypes) 获取指定参数的构造方法
Constructor[] getDeclaredConstructors()
Constructor getDeclaredConstructor(Class… parameterTypes)
3.获取成员方法
Methods[] getMethods()
Methods[] getMethod(String name, Class… parameterTypes)
Methods[] getDeclaredConstructors()
Methods[] getDeclaredConstructor(String name, Class… parameterTypes)
所有包含tDeclared的方法 访问其私有属性时 都需要忽略权限修饰符的安全检查
setAccessible(true) //暴力反射

Field:成员变量
操作:
1.设置值 void set (Object obj,Object value)
2.获取值 get(Object obj)
Constuctor 构造方法
操作:
创建对象: newInstance(Object…initagrs)
Methods 方法对象
操作:
执行方法: invoke(Object obj, Object… args)
获取方法名 : getName()

留疑:众所周知Spring的IOC可以帮我们管理对象 我们只需要使用@Autowired注解 就可以在Controller里注入Service
如果不用Spring框架你可以用反射完成该功能吗?

你可能感兴趣的:(Java反射)