java的反射机制入门

理解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反射机制入门的全部内容了,就是对反射能有一个简单的了解。其实反射机制还有很多的内容的呢,要学的东西还很多呢。反射是个好东西,希望你也学得会。

"你必须精力充沛,才能扛得住世事艰难。"

猜你喜欢

转载自www.cnblogs.com/yanggb/p/10791009.html
今日推荐