举报投诉联系我们 手机版 热门标签 名动网
您的位置:名动网 > java 反射方法 Java 方法反射

java 反射方法 Java 方法反射

2023-03-23 14:20 Java教程

java 反射方法 Java 方法反射

java 反射方法

Java 反射方法是 Java 语言中的一种重要技术,它可以在运行时获取类的信息,并且可以动态地创建、访问和修改类的实例。它也可以用来调用类中的方法和字段,从而使得 Java 程序具有更强大的功能。

Java 反射方法主要包含三个部分:Class 类、Field 类和 Method 类。Class 类用于表示一个特定的类;Field 类用于表示一个特定的字段;Method 类用于表示一个特定的方法。

Class cls = Class.forName("com.example.MyClass");  // 获取 MyClass 的 Class 对象 
Object obj = cls.newInstance();  // 通过 Class 对象创建 MyClass 实例 
Method method = cls.getDeclaredMethod("myMethod", String.class, int.class);  // 获取 MyClass 中名为 myMethod 的方法 
method.invoke(obj, "Hello", 10);  // 调用 MyClass 实例上 myMethod 方法

Java 反射方法不仅能够帮助我们在运行时加载、分析和使用 Java 类,而且还能够帮助我们在不同版本之间兼容 Java 类。此外,Java 反射方法还能够帮助我们在不同平台之间兼容 Java 类,因此 Java 反射方法是非常重要的一项技术。

Java 方法反射

Java反射 - Java方法反射

注:可先通过 java反射机制深入理解剖析 理解基础再学习本篇文章

java.lang.reflect.Method 类的实例表示一个方法。

java.lang.reflect.Constructor 类的实例表示一个构造函数。

方法构造方法继承自一个通用的抽象超类可执行

可执行文件中的参数由 Parameter 类的对象表示

Executable 类中的 ​getParameters()​ 方法获取所有参数作为 Parameter 的数组。

默认情况下,参数名称不存储在类文件中。

参数类的名称将类似于 ​arg0​,​arg1​ 等。

我们可以通过编译源来保存类文件中的实际参数名代码使用 -parameters 选项与 javac 编译器。

可执行文件中的 getExceptionTypes()方法类返回一个由 Executable 抛出的异常数组。

Executable 类的 ​getModifiers()​ 方法将修饰符作为int返回。

来自 Executable 类的 ​getTypeParameters()​ 方法返回一个 TypeVariable 数组,该数组表示通用方法或构造函数的类型参数

例子

import java.lang.reflect.Constructor;
import java.lang.reflect.Executable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.util.ArrayList;

class MyClass<T> {
  
  public MyClass(int i, int j, String s){
    
  }
  public MyClass(T t){
    
  }
  public int getInt(String a){
    return 0;
  }
}

public class Main {
  public static void main(String[] argv){
    Class<MyClass> cls = MyClass.class;
    for(Method m:cls.getMethods()){
      System.out.println(m.getName());
      System.out.println(getModifiers(m)); 
      System.out.println(getParameters(m) );
      System.out.println(getExceptionList(m));
    }
  }
  public static ArrayList<String> getParameters(Executable exec) {
    Parameter[] parms = exec.getParameters();
    ArrayList<String> parmList = new ArrayList<>();
    for (int i = 0; i < parms.length; i++) {

      int mod = parms[i].getModifiers() & Modifier.parameterModifiers();
      String modifiers = Modifier.toString(mod);
      String parmType = parms[i].getType().getSimpleName();
      String parmName = parms[i].getName();
      String temp = modifiers + "  " + parmType + "  " + parmName;
      if(temp.trim().length() == 0){
        continue;
      }
      parmList.add(temp.trim());
    }
    return parmList;
  }

  public static ArrayList<String> getExceptionList(Executable exec) {
    ArrayList<String> exceptionList = new ArrayList<>();
    for (Class<?> c : exec.getExceptionTypes()) {
      exceptionList.add(c.getSimpleName());
    }
    return exceptionList;
  }
  public static String getModifiers(Executable exec) {
    int mod = exec.getModifiers();
    if (exec instanceof Method) {
      mod = mod & Modifier.methodModifiers();
    } else if (exec instanceof Constructor) {
      mod = mod & Modifier.constructorModifiers();
    }
    return Modifier.toString(mod);
  }
}

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

反射方法

以下四个方法在Class类中返回有关类的方法的信息:

Method[]  getMethods()
Method[]  getDeclaredMethods()
Method getMethod(String name,  Class...  parameterTypes)
Method getDeclaredMethod(String name,  Class...  parameterTypes)

getMethods()方法返回该类的所有可访问的公共方法无论从类中还是继承自超类。

getDeclaredMethods()方法返回该类所有只在声明中的方法(不包括从超类继承的方法)。

getMethod(String name,Class ... parameterTypes)和getDeclaredMethod(String name,Class ... parameterTypes)通过方法名和参数类型获取Method对象。

Method类中的getReturnType()方法返回包含有关返回类型信息的Class对象。

import java.lang.reflect.Constructor;
import java.lang.reflect.Executable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.util.ArrayList;

class MyClass<T> {

  public MyClass(int i, int j, String s) {

  }

  public MyClass(T t) {

  }

  public int getInt(String a) {
    return 0;
  }
}

public class Main {
  public static void main(String[] args) {
    Class<MyClass> c = MyClass.class;

    ArrayList<String> methodsDesciption = getDeclaredMethodsList(c);
    System.out.println("Declared Methods  for " + c.getName());
    for (String desc : methodsDesciption) {
      System.out.println(desc);
    }
    methodsDesciption = getMethodsList(c);
    System.out.println("nMethods for  " + c.getName());
    for (String desc : methodsDesciption) {
      System.out.println(desc);
    }

  }

  public static ArrayList<String> getMethodsList(Class c) {
    Method[] methods = c.getMethods();
    ArrayList<String> methodsList = getMethodsDesciption(methods);
    return methodsList;
  }

  public static ArrayList<String> getDeclaredMethodsList(Class c) {
    Method[] methods = c.getDeclaredMethods();
    ArrayList<String> methodsList = getMethodsDesciption(methods);
    return methodsList;
  }

  public static ArrayList<String> getMethodsDesciption(Method[] methods) {
    ArrayList<String> methodList = new ArrayList<>();

    for (Method m : methods) {
      String modifiers = getModifiers(m);

      Class returnType = m.getReturnType();
      String returnTypeName = returnType.getSimpleName();

      String methodName = m.getName();

      String params = getParameters(m).toString();

      String throwsClause = getExceptionList(m).toString();

      methodList.add(modifiers + "  " + returnTypeName + "  " + methodName
          + "(" + params + ") " + throwsClause);
    }

    return methodList;
  }

  public static ArrayList<String> getParameters(Executable exec) {
    Parameter[] parms = exec.getParameters();
    ArrayList<String> parmList = new ArrayList<>();
    for (int i = 0; i < parms.length; i++) {

      int mod = parms[i].getModifiers() & Modifier.parameterModifiers();
      String modifiers = Modifier.toString(mod);
      String parmType = parms[i].getType().getSimpleName();
      String parmName = parms[i].getName();
      String temp = modifiers + "  " + parmType + "  " + parmName;
      if (temp.trim().length() == 0) {
        continue;
      }
      parmList.add(temp.trim());
    }
    return parmList;
  }

  public static ArrayList<String> getExceptionList(Executable exec) {
    ArrayList<String> exceptionList = new ArrayList<>();
    for (Class<?> c : exec.getExceptionTypes()) {
      exceptionList.add(c.getSimpleName());
    }
    return exceptionList;
  }

  public static String getModifiers(Executable exec) {
    int mod = exec.getModifiers();
    if (exec instanceof Method) {
      mod = mod & Modifier.methodModifiers();
    } else if (exec instanceof Constructor) {
      mod = mod & Modifier.constructorModifiers();
    }
    return Modifier.toString(mod);
  }
}

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


阅读全文
以上是名动网为你收集整理的java 反射方法 Java 方法反射全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 名动网 mdwl.vip 版权所有 联系我们