什么是反射?
反射是指在运行时对于任意类都能获得该类的所有方法和属性,并且可以调用该类的任意方法和属性,这种动态调用方法和属性的功能被称为java的反射机制。
如何理解反射?
对于初学者来说反射的定义可能不好理解,其实当我们理解了反射后我们可以用自己的方式去理解定义反射,本人理解反射就一个成语:庖丁解牛,
如果把牛看做一个对象,那么牛头,牛腿等等这些部位合起来就组成了一头完整的牛;我如果拿到了这些所有的部位了那我就能得到一头完整的牛,并且我就能调动牛所有的功能。 回过头再看java,java类在运行时都会被编译为.class文件,那么我如果拿到了某个类的class文件,那么我就能调用该类所有的方法以及属性。
示例
我们以下面的类作为示例:
-
获取该类的Class对象
获取一个类的Class对象有三种方式
//1.通过Class.forName获取 Class<?> aClass = Class.forName("com.dukang.reflect.entity.Dog"); //2.通过类名获取 Class<Dog> aClass1 = Dog.class; //3.通过对象获取 Class<? extends Dog> aClass2 = new Dog().getClass();
-
获取该类的对象
获取类的对象有两种方式:
//1.直接调用newInstance方法 Object newInstance = aClass.newInstance(); //2.根据构造方法获取对象 Constructor<?> constructor = aClass.getConstructor(String.class, int.class); Object tom = constructor.newInstance("tom", 5);
-
获取并调用该类的方法
Method say = aClass.getMethod("say"); say.invoke(newInstance); //根据方法名、参数获取对应的方法,与方法的修饰符无关 Method eat = aClass.getDeclaredMethod("eat", String.class); eat.setAccessible(true); eat.invoke(newInstance,"bone");
这里需要注意
eat.setAccessible()
方法,由于eat方法被private所修饰所以在调用时需要设置可访问参数为true,否则会出现异常:
-
获取类的属性
//根据名称获取对应字段,只能是公共的 Field name = aClass.getField("name"); name.set(newInstance,"jack"); Dog dog = (Dog) newInstance; System.out.println(dog.name);
如果要获取私有的字段可以使用aClass.getDeclaredField()
,根据上面的经验如果要给字段设置值需要设置可访问参数为true。
总结
通过上面的例子我们可以总结下:我们拿到了某个类的Class对象,相当于我们拿到了这个类中的所有内容,既然我们拿到了所有的内容那我们就可以访问和调用该类的所有“内容”。
如果喜欢本文的话记得点一下"关注"支持一下
同时也欢迎大家转发,也可以关注作者的公众号,我们一起学习啊