Java反射详解

这篇文章用于复习自己Java的反射原理,如有问题还请斧正。
Java中反射可以说是贯穿整个Java家族了,平时不管在哪总能听到反射这个这个词,在业内反射有个称呼叫框架的灵魂,今天就来谈谈Java的反射。

源码的状态

Java中源码有3种状态,以下图为例说明:
Java反射详解_第1张图片
1.这里第一个状态我叫他源码状态,相当于你的Java文件和Class文件没有进入内存时的状态。
2.Class状态是指源码进入内存中并被封装到了Class类中。
3.Runtime顾名思义就是运行程序时的状态。

Class类

每个Java文件都有一个Class类对象,可以说是和Object一样重要的类了,这个类中将代码中的属性和操作封装了进去
成员方法封装为Method对象,构造封装为Constructor对象,成员变量封装为Field对象,类中一些重要的方法如下

Class forName(String className)//这个方法返回一个Class对象,一般用于获取一个类的Class类对象

ClassLoader	getClassLoader()//该方法用于将源码载入内存

Field	getDeclaredField(String name)//根据变量名获取成员变量,忽视权限控制符(private等)

Field[]	getDeclaredFields()//获取全部成员变量,忽视权限控制符

Constructor	getDeclaredConstructor(Class... parameterTypes)//根据变量名获取构造,忽视权限控制符(private等)

Constructor[]	getDeclaredConstructors()//获取全部构造,忽视权限控制符

Method	getDeclaredMethod(String name, Class... parameterTypes)//根据变量名获取成员方法,忽视权限控制符(private等)

Method[]	getDeclaredMethods()//获取全部成员方法,忽视权限控制符

上面方法中获取方法,变量,构造的去掉中间的Declared就只能获取到public修饰的对象,不能忽视控制符。

反射

我比较推崇用实战来理解代码,下面用一个简单的小项目来讲解Java的反射。

项目名:Spring框架(假的)

需求:以不修改源代码为基础,完成修改配置文件使创建不同的类(Spring等框架的Xml就是用的反射)

首先我们新建项目,创建类Person,Student
具体代码如下:

 public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public Student() {
    }

    public void study(){
        System.out.println("我是学生我爱学习");
    }
}

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
     public Person() {
    }
    public void eat(){
        System.out.println("我是人我会吃");
    }


}

添加一个测试类运用反射创建这两个类并调用方法

import java.beans.MethodDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;

public class Main {

    public static void main(String[] args) throws Exception {
	// write your code here
       Properties properties= new Properties();//用来加载配置文件
       properties.load(ClassLoader.getSystemResourceAsStream("com/lzx/com/lzx/domain/pro.properties"));//加载配置文件
       Class cls=Class.forName(properties.getProperty("ClassName"));//获取类对象
       Object ob=cls.newInstance();//创建一个实例
       Method met=cls.getMethod(properties.getProperty("MethodName"));//获取方法
       met.setAccessible(true);//暴力反射
       met.invoke(ob);//执行方法



    }
}

创建一个配置文件内容如下

ClassName=com.lzx.com.lzx.domain.Person
MethodName=eat

通过代码可以看出来,在这个小程序中我们只需要修改properties配置文件中ClassName和MethodName的内容就可以实现不更改源代码,通过反射来创建不同的类的实例了

最后来个控制台

Java反射详解_第2张图片
修改一下配置文件看看效果
Java反射详解_第3张图片
以上就是我对反射的理解了,本文自用来复习Java基础的,加深记忆,有一定的参考价值吧。大家看一看也就过去了,留个底方便以后回来复习;

你可能感兴趣的:(Java基础,Java基础,反射,原理)