ToB企服应用市场:ToB评测及商务社交产业平台

标题: 一篇文章讲清楚Java中的反射 [打印本页]

作者: 张春    时间: 2024-8-29 20:19
标题: 一篇文章讲清楚Java中的反射
先容

每个类都有一个 Class 对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象。
类加载相当于 Class 对象的加载。类在第一次使用时才动态加载到 JVM 中,可以使用 Class.forName("com.mysql.jdbc.Driver") 这种方式来控制类的加载,该方法会返回一个 Class 对象。
反射可以提供运行时的类信息,并且这个类可以在运行时才加载进来,甚至在编译时期该类的 .class 不存在也可以加载进来。
Class 和 java.lang.reflect 一起对反射提供了支持,java.lang.reflect 类库紧张包含了以下三个类:
Java反射机制是指在运行时动态地获取一个类的信息并能够操纵该类的属性和方法的能力。Java反射机制使得程序能够在运行时借助Class类的API来操纵自身的属性和方法,从而大大增强了Java的灵活性和可扩展性。
优缺点

优点:
缺点:
  1. public void test2() {
  2.     long start = System.currentTimeMillis();
  3.     for (int i = 0; i < 10000000; i++) {
  4.         getAuthor(); //运行时间15
  5. //       getAuthorByReflect();//运行时间4378
  6.     }
  7.     long end = System.currentTimeMillis();
  8.     System.out.println("运行时间:" + (end - start));
  9. }
复制代码
如何获取
  1. //1. 通过类名.class获取
  2. class s = SubjectService.class;
  3. //2.通过Class.forName名获取
  4. class s = Class.forName(SubjectService);
  5. //3.通过对象.getclass获取
  6. class s = data.getClass();
  7. //4.通过类加载器获取
  8. ClassLoader classLoader = Practice0.class.getClassLoader();
  9. Class s = classLoader.loadClass("全类名");
复制代码
比较四种获取方式的区别?通过类加载器获取的方式不常用,在此不做比较。
应用场景

Java反射技术可以在很多场景中应用,尤其是在框架设计和组件化开发中,反射技术可以提高代码的灵活性和可扩展性,减少代码耦合性,简化代码的编写。但是,反射机制也增加了程序的复杂度,因此必须审慎使用。
执行流程
  1. public class HelloReflect {
  2.     public static void main(String[] args) {
  3.         try {
  4.             // 1. 使用外部配置的实现,进行动态加载类
  5.             TempFunctionTest test = (TempFunctionTest)Class.forName("com.tester.HelloReflect").newInstance();
  6.             test.sayHello("call directly");
  7.             // 2. 根据配置的函数名,进行方法调用(不需要通用的接口抽象)
  8.             Object t2 = new TempFunctionTest();
  9.             Method method = t2.getClass().getDeclaredMethod("sayHello", String.class);
  10.             method.invoke(test, "method invoke");
  11.         } catch (ClassNotFoundException e) {
  12.             e.printStackTrace();
  13.         } catch (InstantiationException e) {
  14.             e.printStackTrace();
  15.         } catch (IllegalAccessException e) {
  16.             e.printStackTrace();
  17.         } catch (NoSuchMethodException e ) {
  18.             e.printStackTrace();
  19.         } catch (InvocationTargetException e) {
  20.             e.printStackTrace();
  21.         }
  22.     }
  23.    
  24.     public void sayHello(String word) {
  25.         System.out.println("hello," + word);
  26.     }
  27. }
复制代码

反射获取类实例

获取类信息

首先调用了 java.lang.Class 的静态方法,获取类信息。
[code]@CallerSensitivepublic static Class




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4