2021-04-18 11:22  阅读(65)
文章分类:Java 基础教程 文章标签:JavaJava 教程
©  原文作者:w3cschool 原文地址:https://www.w3cschool.cn/java/java-java-lang-class.html

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());
        }
      }
    }
    

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

2021041811212_1.png

带参数的构造函数

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

  • 获取构造函数的实例
  • 调用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());
        }
      }
    }
    

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

202104181126_2.png

调用方法

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

要调用方法,请调用方法引用的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());
        }
      }
    }
    

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

202104181123_3.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java 反射对象创建
上一篇
Java 构造函数反射
下一篇
Java 反射字段访问