今天我们就来讲讲java的反射机制。
当程序主动使用某个类的时候,如果该类还没有被加载到内存中,则系统会通过加载、连接、初始化这三个步骤对该类进行初始化,有时候会把这一整个流程叫做类加载器或类初始化
类加载时值将类文件读入到内存中,并且为该类创建一个对象、之后可以直接通过对象来调用类及其实现的父类方法和属性
一、反射机制到底是什么:类是由一组对象(拥有着共同属性)来组成的,而类与类之间也有共同的属性、构造方法、方法等结构,用来描述类的特性,即可以调用或查看某个类的属性、方法、即构造方法就叫做反射。
二、java反射机制的好处:
1.极大的提高了应用程序的扩展性,之前都是通过多来将子类对象传递给父类应用来实现的,大大的增加了代码的耦合性,并且无法访问真实对象的信息,这个时候就可以采取使用反射机制。
2.当代码需要后期维护的时候,则需要修改很多地方,而通过反射机制,只需要直接修改一个地方即可。
e.g Person person=new Student();
三、应用场景:一般应用于底层框架的应用,不过大部分都已经封装好了的、以及可以实现工厂模式和代理模式等设计模式,同时也可以解决java泛型擦除等令人苦恼的问题
一个类的组成:
成员变量、成员方法、构造方法、修饰符、包等
四、反射的组成:1.Class(类本身) 2.Field(属性) 3.Method(方法)
接下来就直接进入代码阶段吧:
一、获取类的三种方法:
Person person = new Person();
1.Class clazz = Person.class;//通过类来获取对象
2.Class clazz = Class.forName("Reflect.Person");//通过类权限名(包名.类名)来获取Class对象
//Class.forName会抛出异常,因为根据字符串来找到类,所以可能会出现找不到这样的类异常
3.Class clazz = person.getClass();//通过类对象来调用
二、自身类
Class []interfaces = clazz.getInterfaces();//获取Person类里所有的接口
String classname = clazz.getName();//获取类名字(包名.类名)
String simpleName = clazz.getSimpleName(); //仅仅只是获得类名字,并没有包名
int modifiers = clazz.getModifiers();//获取权限符是什么 返回值是int 1:public 2:private依次
Package aPackage = clazz.getPackage();//获得包名
Class superclass = clazz.getSuperclass();//获取该类的父类,有且只有一个
Object o = clazz.newInstance();//生成类的实例对象,由于不知道要生成什么类的对象,而所有类的顶端都是Object的子类
三、属性(Filed)
Field math = clazz.getField("math");//获得指定的name属性,有且只能找到public的属性
Field[] fields = clazz.getFields();//获得所有的public的属性,以及父类
Field id = clazz.getDeclaredField("id");//获得public 以及private、protected等指定(id)属性
Field[] declaredFields = clazz.getDeclaredFields();//获得所有的属性以及父类
当然找到属性能干嘛了,最重要的就是赋值啦。
由于私有属性,除了本类以外的类都不可进行其访问,所以在设置值上面自然和public的不太一样
public属性设值:
Field name = clazz.getField("name");
name.set(o,"TTL");//第一个属性是要设置值得属性属于哪个类实例化对象里面的,第二个参数则是要设置的值
private属性设置:
Field sex = clazz.getDeclaredField("sex");
sex.setAccessible(true);//设置访问权限
sex.set(person1,"女");
四、方法
Method setAddress = clazz.getMethod("Address", String.class);
//第一个参数为要找方法的名字,第二个参数则是要找方法的形参是什么类型的
Object address = setAddress.invoke(person1, "苏州");
//第一个参数为类实例化的对象,第二个参数为参数要设置的值
//执行方法
五、构造方法
Constructor constructor = clazz.getConstructor(String.class, String.class);
//由于构造方法和类名一样,这里就不需要在此写类名对象了,只需写参数即可匹配到对应的构造方法
constructor.newInstance("TTL","四川");//执行构造方法
来源:CSDN
作者:Gaigai___
链接:https://blog.csdn.net/GaiGai_/article/details/103673903