理解Java的反射机制对学习Java框架有很大帮助,比如Spring框架的核心就是使用Java反射实现的,同时对做一些Java底层操作也会有帮助,比如字节码操作、自定义注解等。
什么是反射
Java反射说的是在运行状态中,对于任何一个类,我们都能够直到这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。这种动态获取对象信息和调用对象方法的功能就是Java的反射机制。
反射的三种方式
反射其实就是获取类的字节码文件,也就是.class文件,那么我们就可以通过Class这个对象进行获取。
【类.class】获取类的字节码文件
Class clazz = ReflectTest.class; System.out.println(clazz.getName()); // com.yanggb.test.ReflectTest
【实例.getClass()】获取类的字节码文件
List<String> list = new ArrayList<>(); Class clazz = list.getClass(); System.out.println(clazz.getName()); // java.util.ArrayList
【Class.forName(类的全路径名)】获取类的字节码文件
try { Class clazz = Class.forName("com.yanggb.test.ReflectTest"); System.out.println(clazz.getName()); // com.yanggb.test.ReflectTest } catch (ClassNotFoundException e) { e.printStackTrace(); }
要注意的是,通过类的全路径名获取Class对象,如果找不到这个类会抛出异常,必须手动处理异常。
这三种方式中,第一种需要导入类的包,依赖性太强;第二种方式已经创建了对象,这个时候其实已经不需要去反射了,显得有些多此一举;第三种方式则不需要这个类一定存在,不存在时可以进行另外的操作(异常处理)。因此一般选用第三种方式做反射操作。
通过反射获取类的成员变量、成员方法
获取所有构造方法
Constructor[] constructors = clazz.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); }
获取所有成员变量
Field[] fields = clazz.getFields(); for (Field field : fields) { System.out.println(field); }
获取所有成员方法
Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println(method); }
这些方法都封装在Class类中,使用的话可以去查阅API,它提供了丰富的API来满足各种各样的要求,这里就只列举上面这三个方法了。
反射调用类的成员方法
反射调用类的方法是通过invoke方法去执行的。
Method[] methods = clazz.getMethods(); for (Method method : methods) { method.invoke(); }
总结
以上内容就是Java反射机制入门的全部内容了,就是对反射能有一个简单的了解。
反射机制还有很多的内容呢,要学的东西还很多。但是反射是个好东西,希望你也学得会。
"你必须精力充沛,才能扛得住世事艰难。"