Java之反射机制

本小妞迷上赌 提交于 2019-12-25 19:58:03

今天我们就来讲讲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","四川");//执行构造方法
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!