首先我们先来讨论三个问题,JAVA反射机制它是什么,它能做什么,他怎么做
什么是JAVA反射机制
一、是什么
专业说法:
java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有方法和属性,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能就是java语言的反射机制,
注意:动态获取、动态获取、动态获取。重要的事情说三遍
通俗点讲:
你想吃猪肉,你去大街上买腰子或者大腿或者做好的猪头肉。而反射机制就是,你想吃猪肉,直接抬过来一头猪放在案板上,你用刀随意想吃啥就剁哪个部位,外到猪皮,内到心肺,全部给你暴露出来,拿到之后,可以任你宰割。相比而言,到大街上买猪肉更方便些,想吃什么就买什么,而搞了一头猪你还要自己去剁,自己去洗,自己去做,但是,自己家里做饭可以买,要是饭店做菜呢,饭店的客人需求都不一样,难道来一位客人你还要到大街上买一块猪肉吗。这就是反射机制应用场景的优点。你到某个城市出差可能住两三个月,当然选择住酒店更好一点,但是你要在这个城市生活一辈子,想必肯定要买一套房子了。当然,房价的问题我们不在这里讨论。
二、能做什么
在实际开发中,我们需要把一个包中的class new出来,但是这个包中的类总是需要变动,那么怎么办,难道总是修改main方法中xxx=new xxx()吗。这样无疑是麻烦的。而运用反射。我们可以相应的增加一个配置文件,在里面记录包中所有的类名,包中类增加时就加一个类名,删除时就删除一个类名。让main方法去读取这个配置文件中的类名,通过反射获得实例,完全不用我们去修改main方法中的代码。说起来可能比较枯燥,也很难理解,可以去看我另一篇文章:《》你会对能做什么有一个新的认知高度
三、怎么做
为什么要用反射机制,简单一句话:获取java的class文件,使java类完全暴露出来,任你宰割,这里只简单介绍如何获取class文件
java虚拟机在加载类文件的时候,将我们能看懂的代码文件转换成java虚拟机能看懂但是我们看不懂的的二进制文件,也就是类的加载,而反射机制就是指通过包名+类名的方式获取到此类的字节码文件,然后通过一系列的操作,获取到此类的实例,进而对此类的方法或属性进行一系列的操作。
获取class文件方法有三:
此时此刻有一个Person类,类的结构如下
public class Person {
private int age;
private String name;
public void show(){
System.out.println("show 方法");
}
public void song(){
System.out.println("song 方法");
}
}
从现在开始抛弃你习惯的用法
Person person = new Person(); 然后 person.show(); 调用show()方法,看下面方式你会对创建对象实例有一个新的认识
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//方式一
Class<Person> personClass = Person.class;
//方式二
Person person = new Person();
Person person1 = new Person();
Class<? extends Person> aClass = person.getClass();
Class<? extends Person> aClass1 = person1.getClass();
//方式三、 重点掌握的一种方法,此方式可扩展性非常强
//注意看这个String类型的name,具体我不给你讲,你自己思考为什么这样做
String name = "com.Person";
Class<?> aClass2 = Class.forName(name);
//newInstance获取类实例
Object obj = aClass2.newInstance();
//此时此刻我已经获得了Person的类,既没有导包,也没有new仅仅是用了 包名+类名的方式
}
}