Java Class

原文:https://www.studytonight.com/java/reflection-classes.php

在前一个主题中,我们讨论了如何在运行时使用各种方法加载类。在这里,我们将看到如何获取该类的元数据、方法和字段。

Classjava.lang 包中的最后一个类,它扩展了 Object 类。此类的实例表示运行的 Java 应用中的类和接口。它用于在运行时分析和更改类的动态行为。

Java.lang.Class 方法

这个类定义了几个方法,使用这些方法我们可以在运行时获得类的方法构造器修饰符成员的信息。

续见()

此方法以类或接口的完全限定名作为参数,并返回与之关联的类的实例。

语法

static **Class**< ?> forName(String *className*)

示例:获取类元数据

要获取类的元数据,首先需要使用class.forName()方法加载类,然后使用 class 方法。在这个例子中,我们使用getName()方法获取类名,getDeclaredFields()获取该类的所有字段。见下面的例子。

  package myjavaproject;

import java.util.Arrays;

// Employee Class
class Employee{

  // Fields 
  int empId;
  String name;

  // Constructor
  Employee(int empId, String name){
    this.empId = empId;
    this.name = name;
  }

  // Method
  void showInfo() {
    System.out.println("Employee Id: "+empId);
    System.out.println("Employee Name: "+name);
  }
}

class Demo{
  public static void main(String[] args) throws ClassNotFoundException {

    // Employee class
    Class name = Class.forName("myjavaproject.Employee");
    // Get class Name
    System.out.println(name.getName());
    // Get Package
    System.out.println(name.getPackageName());
    System.out.println(name.getTypeName());
    Arrays.stream(name.getDeclaredConstructors()).forEach(System.out::println);
    Arrays.stream(name.getDeclaredFields()).forEach(System.out::println);
    Arrays.stream(name.getDeclaredMethods()).forEach(System.out::println);
  }
}

我的 myjavaproject。员工 my javap project my javap project。员工 myjavaproject。Employee(int,Java . lang . String)int myjavaproject。employee . empid Java . lang . string my javap project。employee . name void my javap project。Employee.showInfo()

示例:获取字段元数据

为了处理类字段,Java 提供了一个位于 java.lang.reflect 包中的 Field 类。此类包含有助于获取字段元数据的方法。在这个例子中,您可以看到我们使用了 class.forName 来加载类,然后使用 Field 类来获取类的元数据。

  package myjavaproject;

import java.lang.reflect.Field;

// Employee Class
class Employee{

  // Fields 
  int empId;
  String name;

  // Constructor
  Employee(int empId, String name){
    this.empId = empId;
    this.name = name;
  }

  // Method
  void showInfo() {
    System.out.println("Employee Id: "+empId);
    System.out.println("Employee Name: "+name);
  }
}

class Demo{
  public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {

    // Employee class
    Class name = Class.forName("myjavaproject.Employee");
    // Get Fields metadata
    Field[] field = name.getDeclaredFields();
    for(Field f: field) {
      System.out.print(f.getType()+" ");
      System.out.println(f.getName());
      System.out.println(f.getModifiers());     
    }   
  }
}

int empId 0 类 java.lang.String 名称 0

示例:获取方法元数据

为了处理类方法,Java 提供了一个位于 java.lang.reflect 包中的方法类。此类包含有助于获取方法元数据的方法。在这个例子中,您可以看到我们使用了 class.forName 来加载类,然后使用 Method 类来获取方法的元数据。

  import java.lang.reflect.Method;

// Employee Class
class Employee{

  // Fields 
  int empId;
  String name;

  // Constructor
  Employee(int empId, String name){
    this.empId = empId;
    this.name = name;
  }

  // Method
  void showInfo() {
    System.out.println("Employee Id: "+empId);
    System.out.println("Employee Name: "+name);
  }
}

class Demo{
  public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {

    // Employee class
    Class name = Class.forName("myjavaproject.Employee");
    // Get method metadata
    Method[] method = name.getDeclaredMethods();
    for(Method m: method) {
      System.out.println(m);
      System.out.println(m.getDefaultValue());
      System.out.println(m.getModifiers());
      System.out.println(m.getName());
      System.out.println(m.getParameterCount());
      System.out.println(m.getReturnType());
    }   
  }
}

void myjavaproject。employee . ShowInfo()null 0 ShowInfo 0 无效

示例:获取构造器元数据

一个类可能有几个构造器,包括参数化的和非参数化的。Java 反射提供了由方法组成的构造器类,可以用来获取构造器的元数据。在这个例子中,我们使用构造器类及其方法来获取构造器的元数据。请看下面的例子。

  package myjavaproject;

import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

// Employee Class
class Employee{

  // Fields 
  int empId;
  String name;

  // Constructor
  Employee(int empId, String name){
    this.empId = empId;
    this.name = name;
  }

  // Method
  void showInfo() {
    System.out.println("Employee Id: "+empId);
    System.out.println("Employee Name: "+name);
  }
}

class Demo{
  public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {

    // Employee class
    Class name = Class.forName("myjavaproject.Employee");
    // Get method metadata
    Constructor[] constructor = name.getDeclaredConstructors();
    for(Constructor c: constructor) {
      System.out.println(c);
      System.out.println(c.getModifiers());
      System.out.println(c.getName());
      System.out.println(c.getParameterCount());
      System.out.println(c.getDeclaringClass());
      Parameter[] parameters = c.getParameters();
      for(Parameter p : parameters) {
        System.out.println(p);
      }

      Class[] pt = c.getParameterTypes();
      for(Class s : pt) {
        System.out.println(s);
      }
    }   
  }
}

我的 myjavaproject。Employee(int,Java . lang . string)0 my javaproject。员工 2 类 myjavaproject。employee int arg 0 Java . lang . string arg 1 int class Java . lang . strings

getConstructors()和 getDeclaredConstructors()

getConstructors()方法返回表示调用对象的所有公共构造器的构造器对象数组。记住,这个方法只返回公共构造器。如果你想看到一个类的所有声明的构造器,那么使用getDeclaredConstructors()。以下是两者的一般语法,

**Constructor**< ?>[] *getConstructors*();
**Constructor**< ?>[] *getDeclaredConstructors*();

示例:getConstructors()和 getDeclaredConstructors()方法

这两种方法都用于获取类构造器,但是getConstructors()只返回公共构造器,而getDeclaredConstructors()返回所有可用的构造器。

import java.lang.reflect.*;
class Student
{
  public Student(){}
  public Student(String name){}
}

class Test
{
  public static void main(String args[])
  {
    try
    {
      Class c = Class.forName("Student");
      Constructor< Student>[] ct = c.getConstructors();
      for(int i=0; i< ct.length; i++)
      { System.out.println(ct[i]); }
      Constructor< Student>[]cdt = c.getDeclaredConstructors();
      for(int i=0;i< cdt.length;i++)
      { System.out.println(cdt[i]);}
    }
    catch(Exception e)
    { e.printStackTrace();}
  }
}

公共学生公共学生公共学生公共学生

getMethods()和 getDeclaredMethods()

getMethods()方法返回 method 对象的数组,该数组反映调用对象的所有公共方法。getDeclaredMethods()只返回调用类对象的声明方法。两者语法如下:

**Method**< ?>[] *getMethods*();
**Method**< ?>[] *getDeclaredMethods*();

示例:getDeclaredMethods()方法

让我们举一个例子,在这个例子中,我们使用getDeclaredMethods()方法来获取类中所有声明的方法。见下面的例子。

import java.lang.reflect.*;
class Student
{
  public void show(){}
  void display(){}
}

class Test
{
  public static void main(String args[])
  {
    try
    {
      Class c = Class.forName("Student");
      Method md[] = c.getDeclaredMethods();
      for(int i=0; i< md.length; i++ )
      { System.out.println(md[i]); }
    }
    catch(Exception e)
    { e.printStackTrace();}
  }
}

公共 void Student.show()

getFields()和 getDeclaredFields()

getFields()返回一个包含 Field 对象的数组,该数组反映了该 class 对象表示的类或接口的所有可访问的公共成员。getDeclaredFields()返回一个字段对象数组,该数组反映了该类对象所代表的类或接口所声明的所有字段。

**Field**< ?>[] *getFields*();
**Field**< ?>[] *getDeclaredFields*();

示例:getFields()和 getDeclaredFields()方法

要获取一个类的字段,我们可以使用getFields()getDeclaredFields()方法。除了 getFields 只返回公共字段之外,两者都返回字段。见下面的例子。

import java.lang.reflect.*;
class Student
{
  public  String name;
  int roll;
}

class Test
{
  public static void main(String args[])
  {
    try
    {
      Class c = Class.forName("Student");
      Field ff[] = c.getFields();
      for(int i=0; i< ff.length; i++)
      { System.out.println(ff[i]); }
      Field f[] = c.getDeclaredFields();
      for(int i=0;i< f.length; i++)
      { System.out.println(f[i]);  }
    }
    catch(Exception e)
    { e.printStackTrace();}
  }
}

public Java . lang . string student . name public Java . lang . string student . name int student . roll