理解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 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反射机制入门的全部内容了,就是对反射能有一个简单的了解。
反射机制还有很多的内容呢,要学的东西还很多。但是反射是个好东西,希望你也学得会。
"你必须精力充沛,才能扛得住世事艰难。"