美文网首页
Java反射初始化类调用类中的方法

Java反射初始化类调用类中的方法

作者: 出来混要还的 | 来源:发表于2019-08-29 12:53 被阅读0次

1.通过无参构造方法实例化对象

无参构造方法,类

public class ReflectServiceImpl {

  public ReflectServiceImpl() {
  }

  public void sayHello(String name) {
    System.out.println("hello" + name);
  }
}

反射调用方式

public static void main(String[] args) {
    ReflectServiceImpl reflectServiceImpl = null;
    try {
      reflectServiceImpl = (ReflectServiceImpl) Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance();
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    reflectServiceImpl.sayHello("张三");
  }

2. 有参构造函数,对象实例化

有参构造函数类

public class ReflectServiceImpl2 {

 private int age;
  private String name;

  public ReflectServiceImpl2(String name, Integer age) {
    this.name = name;
    this.age = age;
  }

  public void sayHello() {
    System.out.println("hello" + name + ",年龄" + age);
  }
}

反射调用方式

public static void main(String[] args) {
    ReflectServiceImpl2 reflectServiceImpl = null;
    try {
      reflectServiceImpl = (ReflectServiceImpl2) Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl2")
          .getConstructor(String.class, Integer.class)
          .newInstance("张三", 13);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SecurityException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    reflectServiceImpl.sayHello();
  }

主要通过getConstructor方法指定构造方法参数的类型和个数。注意通过反射调用构造时,构造函数中的参数必须是类,所以参数不能是基本类型?

3. 通过方法名称,调用类中的方法

public class ReflectServiceImpl2 {

  private int age;
  private String name;

  public ReflectServiceImpl2(String name, Integer age) {
    this.name = name;
    this.age = age;
  }

  public void sayHello() {
    System.out.println("hello" + name + ",年龄" + age);
  }

  public void sayHello(String name, Integer age) {
    System.out.println("hello" + name + ",年龄" + age);
  }
}

调用无参的sayHello

public static void main(String[] args) {
    ReflectServiceImpl2 reflectServiceImpl = null;
    try {
      reflectServiceImpl = (ReflectServiceImpl2) Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl2")
          .getConstructor(String.class, Integer.class).newInstance("张三", 13);
      Method method = reflectServiceImpl.getClass().getMethod("sayHello", null);
      method.invoke(reflectServiceImpl, null);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SecurityException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

getMethod 和调用方法invoke参数都传入null。
调用两个参数的sayHello

public static void main(String[] args) {
    ReflectServiceImpl2 reflectServiceImpl = null;
    try {
      reflectServiceImpl = (ReflectServiceImpl2) Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl2")
          .getConstructor(String.class, Integer.class).newInstance("张三", 13);
      Method method = reflectServiceImpl.getClass().getMethod("sayHello", String.class, Integer.class);
      method.invoke(reflectServiceImpl, "李四", 16);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SecurityException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

getMethod 和调用方法invoke参数都传入参数对应的类。

相关文章

  • 关于java及Spring环境下反射的使用举例:

    一:java中反射调用举例: 1,写一个类,作为后面被反射调用的类及对方法。类名:TcpProcessServic...

  • Java反射初始化类调用类中的方法

    1.通过无参构造方法实例化对象 无参构造方法,类 反射调用方式 2. 有参构造函数,对象实例化 有参构造函数类 反...

  • 【日拱一卒】:反射的作用和意义?

    Java的反射:在程序运行过程中,动态的获取类的信息和动态调用对象的方法。反射就是把java类中的各种成分映射成一...

  • java反射机制

    java反射机制是为了动态获取类的结构,动态地调用对象的方法 java反射机制 获取类Class对象 A.clas...

  • Android ndk 中c 调用Java

    c调用java 中的方法 c代码中通过反射得到java 对象 1.新建Java类 2新建C文件 获取Java方法的...

  • 用Java实现JVM第九章《本地方法调用》

    案例介绍本章主要介绍用java实现一些本地方法类库,并初始化本地方法,之后通过反射命令来调用本地方法。 Java虚...

  • 用Java实现JVM第九章《本地方法调用》

    案例介绍 本章主要介绍用java实现一些本地方法类库,并初始化本地方法,之后通过反射命令来调用本地方法。 Java...

  • java反射和动态代理

    java反射 反射是程序运行时,通过反射直接操作对象或者类。获取类声明的属性和方法,调用方法或者构造对象,设置修改...

  • jni反射java方法

    在我们写Android代码时,调用一个类中没有公开的方法,可以进行反射调用,而JNI开发中C++调用java的方法...

  • Jvm学习笔记(三)

    类的初始化和加载 类初始化 遇到new,或读取、修改或调用一个类的static变量时。 反射调用。 初始化一个类时...

网友评论

      本文标题:Java反射初始化类调用类中的方法

      本文链接:https://www.haomeiwen.com/subject/fgciectx.html