举报投诉联系我们 手机版 热门标签 鳄鱼CMS
您的位置:鳄鱼CMS > java 反射创建对象 Java 反射对象创建

java 反射创建对象 Java 反射对象创建

2023-03-08 03:31 Java教程

java 反射创建对象 Java 反射对象创建

java 反射创建对象

Java 反射是 Java 语言的一种功能,它允许程序在运行时动态地获取、操作任何类的信息,包括类的名字、属性、方法和构造函数。反射机制可以使我们在不了解类的情况下,创建对象并调用其方法。

Java 反射机制提供了一种通过字符串来操作对象的方式,它可以帮助我们在运行时动态地创建对象。使用反射机制,我们可以根据字符串来实例化一个对象,而不需要显式地使用 new 关键字。

Class clazz = Class.forName("com.example.MyClass");  // 获得Class对象 
Object obj = clazz.newInstance();  // 通过Class对象实例化一个新的对象 

上面代码中,我们使用 Class 的 forName() 方法来根据字符串“com.example.MyClass”来加载 MyClass 的 Class 对象;然后使用 newInstance() 方法来实例化一个新的 MyClass 对象。

此外,Java 还提供了 Constructor 的 newInstance() 方法来创建带有参数的对象。Constructor 的 newInstance() 方法会根据传入的参数去找到合适的构造函数并实例化一个新的对象。

Constructor constructor = clazz.getConstructor(String.class, int.class);  // 获得带有特定参数签名的Constructor对象 
Object obj = constructor.newInstance("Hello", 123);  // 通过Constructor实例化一个新的MyClass对象 

Java 反射对象创建

Java反射 - Java反射对象创建


我们可以使用反射动态创建类的对象。通过调用其中一个构造函数。

然后我们可以访问对象的字段的值,设置它们的值,并调用它们的方法。

有两种方法来创建对象:

  • 使用no-args构造函数
  • 使用带参数的构造函数

无参数构造函数

如果你有一个 Class 对象的引用,你可以创建一个对象该类对Class类使用 newInstance()方法。

此方法不使用参数,并且是等效的使用new运算符的类的no-args构造函数。

MyClass m  = myObject.newInstance();
class MyClass {
  public MyClass() {
     System.out.println("called");
  }
}
public class Main {
  public static void main(String[] args) throws InstantiationException {
    Class<MyClass> personClass = MyClass.class;
    try {
      MyClass p = personClass.newInstance();
      System.out.println(p);
    } catch (InstantiationException | IllegalAccessException e) {
      System.out.println(e.getMessage());
    }
  }
}

上面的代码生成以下结果。


带参数的构造函数

您可以通过调用特定的构造函数使用反射创建对象。它涉及两个步骤。

  • 获取构造函数的实例
  • 调用newInstance来调用它

你可以得到这个构造函数的引用,如图所示:

Constructor<MyClass> cons  = myClass.getConstructor(int.class, String.class);

然后调用带有参数的 newInstance()方法来创建一个对象。

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

class MyClass {
  public MyClass(int i, String s) {
    System.out.println("called");
    System.out.println(i);
    System.out.println(s);
  }
}
public class Main {
  public static void main(String[] args) {
    Class<MyClass> myClass = MyClass.class;
    try {
      Constructor<MyClass> cons = myClass.getConstructor(int.class,
          String.class);
      MyClass chris = cons.newInstance(1, "abc");
      System.out.println(chris);
    } catch (NoSuchMethodException | SecurityException | InstantiationException
        | IllegalAccessException | IllegalArgumentException
        | InvocationTargetException e) {
      System.out.println(e.getMessage());
    }
  }
}

上面的代码生成以下结果。

调用方法

我们可以通过方法引用使用反射调用方法。

要调用方法,请调用方法引用的 invoke()方法。

它的第一个参数是它来自和的对象第二个参数是同一顺序中所有参数的varargs作为方法的声明。

在静态方法的情况下,我们只需要为第一个参数指定null。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

class MyClass {
  public MyClass() {
  }

  public void setName(String n) {
    System.out.println(n);
  }
}

public class Main {
  public static void main(String[] args) {
    Class<MyClass> myClass = MyClass.class;
    try {
      MyClass p = myClass.newInstance();
      Method setName = myClass.getMethod("setName", String.class);
      setName.invoke(p, "abc");
    } catch (InstantiationException | IllegalAccessException
        | NoSuchMethodException | SecurityException | IllegalArgumentException
        | InvocationTargetException e) {
      System.out.println(e.getMessage());
    }
  }
}

上面的代码生成以下结果。

阅读全文
以上是鳄鱼CMS为你收集整理的java 反射创建对象 Java 反射对象创建全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • json形式 JSON 模式

    json形式 JSON 模式

    2023-05-07 Java教程

    Java JSON教程 -JSON模式像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用...

  • 异步套接字是什么 Java 异步套接字通道

    异步套接字是什么 Java 异步套接字通道

    2023-03-10 Java教程

    Java网络教程 -Java异步套接字通道使用以下两个套接字通道类来执行异步套接字操作:java.nio.channels.AsynchronousServerSocket...

  • java集合foreach JavaFX 集合

    java集合foreach JavaFX 集合

    2023-03-17 Java教程

    JavaFX教程 -JavaFX集合JavaFX中的集合由javafx.collections包定义,javafx.collections包由以下接口和类组成:接口接口描述Obse...

  • java持久性 Java 实例/持续时间

    java持久性 Java 实例/持续时间

    2023-03-04 Java教程

    Java日期时间 -Java实例/持续时间实例和持续时间允许我们记录时间戳和已用时间。我们可以从瞬间添加和减去持续时间,以获得另一...

  • java 流 Java 流连接

    java 流 Java 流连接

    2023-03-08 Java教程

    Java流连接Collectors类的joining()方法返回一个收集器,它连接CharSequence流,并将结果作为String返回。joining()方法是重载的...

© 2024 鳄鱼CMS eyucms.com 版权所有 联系我们