JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java 反射机制 Java反射机制的作用

wys521 2024-11-14 19:23:59 精选教程 24 ℃ 0 评论

什么是反射

反射是一种在程序运行时动态获取信息和操作对象的机制。在计算机编程中,反射机制是指在运行时动态地获取对象的信息(如属性、方法、类名等)以及动态地调用对象的方法或操作对象的属性的能力。例如,在 Java 语言中,可以通过反射机制在运行时获取一个类的所有方法和属性,并且可以调用这些方法或者设置属性的值,而不需要在编译时就知道这些信息。

一、获取类对象

可以通过以下几种方式获取类对象:

1.使用类名.class:

   Class<?> clazz = User.class;
  1. 使用对象的getClass()方法:
   User user = new User();
   user.setName("zhangsan");
   Class<?> clazz = user.getClass();
  1. 使用Class.forName()方法,需要传入全限定类名:
   try {
       Class<?> clazz = Class.forName("com.edwin.java.po.User");
   } catch (ClassNotFoundException e) {
       e.printStackTrace();
   }

二、获取构造方法并创建对象

  1. 获取所有公共构造方法
   Class<?> clazz = User.class;
   Constructor<?>[] constructors = clazz.getConstructors();
   for (Constructor<?> constructor : constructors) {
       System.out.println("公共构造方法:" + constructor);
   }

2.获取特定参数的构造方法并创建对象:

   try {
       Class<?> clazz = User.class;
       Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
       Person person = (Person) constructor.newInstance("张三", 20);
       System.out.println(person.getName() + "," + person.getAge());
   } catch (Exception e) {
       e.printStackTrace();
   }

3.获取方法和调用

   Class<?> clazz = User.class;
   Method[] methods = clazz.getMethods();
   for (Method method : methods) {
       System.out.println("公共方法:" + method);
   }

   try {
       Class<?> clazz = User.class;
       Method method = clazz.getMethod("setName", String.class);
       User user = new User();
     // 设置值
       method.invoke(user, "李四");
       System.out.println(person.getName());
   } catch (Exception e) {
       e.printStackTrace();
   }

4.获取字段属性并操作

   Class<?> clazz = User.class;
   Field[] fields = clazz.getFields();
   for (Field field : fields) {
       System.out.println("公共属性:" + field);
   }

   try {
       Class<?> clazz = User.class;
       Field field = clazz.getField("age");
       User user = new User();
       field.set(user, 25);
       System.out.println(user.getAge());
   } catch (Exception e) {
       e.printStackTrace();
   }

以上是Java中反射的一些基本的使用方法,其中还有很多的函数。其实他的作用主要是实现动态编程。可以在程序运行时根据用户输入、配置文件或其他动态条件来创建对象;方法动态调用:在不知道具体方法名称的情况下,根据运行时的条件来调用对象的方法。这在实现插件系统、脚本执行引擎等方面非常有用。还可以增强代码的灵活性和扩展性。

另外有对说反射慢,影响性能等问题。

1、由于反射涉及动态解析的类型,因此不能执行某些Java虚拟机优化,如JIT优化。

2、为了提高反射操作的性能,可以使用缓存来存储反射操作的结果,例如类对象、方法对象等。但是,由于反射操作的动态性,缓存的有效性可能会降低。

3、反射调用方法时会从方法数组中遍历查找,并且会检查可见性。这些动作都是耗时的。

4、不仅方法的可见性要做检查,参数也需要做很多额外的检査

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表