Java的反射
今天学习spring时,遇到java反射的问题,写点自己查资料的收获;
什么是Class呢
首先Java中有一个特殊的Class类型的对象,一个Class对象包含了特定某个类的有关信息,如某个类实现了哪些接口,某个类的数据成员名,方法,构造器;Class类相当于是一个类反射之后得到对于这个类的描述类;
Class中封装了描述方法信息的Method,描述字段的Field,描述构造器的Constructor
那么如何得到一个Class类呢?
- 类名.class
- Class.forName(“类名字符串”)(注:类名字符串是包名+类名)
- 实例对象.getClass()
//1.类加载器
ClassLoader classLoader = JdkProxy.class.getClassLoader();
//2.被代理对象实现的所有接口
Class<?>[] clazz = userDao.getClass().getInterfaces();
知道了这些后,我们可能会思考,为什么要使用反射呢?
- 有可能这个对象是别的方法传过来的,我们想动态处理
- 有可能没有对象,只有一个全类名
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
Class类的常用方法
返回值 方法名 | 说明 |
---|---|
String getName() | 返回此Class对象所表示的实体(类,接口,数组类)的名称 |
Class<?>[] getInterfaces() | 获取当前Class对象实现的所有接口 |
ClassLoader getClassLoader() | 返回该类的类加载器 |
Object newInstance() | 调用缺省构造函数,返回该Class对象的一个实例 |
Object newInstance(Object []args) | 调用当前格式构造函数,返回该Class对象的一个实例 |
Class getSuperClass() | 返回当前Class对象的父类的Class对象 |
Class类中较为常见的是获取Method
Class clazz = Class.forName("com.atguigu.java.fanshe.Person");
//1.获取Clazz对应类,即Person中的所有方法,但不包括private方法和从父类继承来的所有方法
Method[] methods1 = clazz.getMethods();
//2.获取Clazz对应类中的所有声明的方法,包括私有方法,但不包括从父类继承来的方法
Method[] methods2 = clazz.getDeclaredMethod();
//3.获取指定的方法
//对于方法 public void setName(String name)
Method method3 = clazz.getDeclaredMethod("setName",String.class);
//对于方法public void setAge(int age)
Method method4 = clazz.getDeclaredMethod("setAge",int.class);
//4.method.invoke(Object obj,Object args)是用于执行method代表的方法
//obj表示执行哪个对象的方法,args是执行方法时需要传入的参数
Object obj = clazz.newInstance();
//如果是私有方法,则需在invoke之前加一句method.setAccessible(true);
method.invoke(obj,2);
目前本人只学懂了这些,如需更加深入学习,请参考https://www.cnblogs.com/tech-bird/p/3525336.html