Home Java JavaBase How to understand java reflection

How to understand java reflection

Nov 13, 2019 am 10:19 AM
java

How to understand java reflection

How to understand java reflection?

Overview

Java reflection is a mechanism that allows us to obtain internal information of classes such as methods, properties, parent classes, interfaces, etc. at runtime. In other words, reflection is essentially a "reverse" process. When we create an instance of a class through new, it is actually constructed by the Java virtual machine at runtime based on the Class object of this class. Reflection obtains its definition information through the Class object of a class, so that we can access it. Go to its attributes and methods, know the parent class of this class, which interfaces are implemented, and other information.

Class class

We know that using javac can compile a .java file into a .class file. This .class file contains our original definition information for the class (parent classes, interfaces, constructors, properties, methods, etc.). The .class file will be loaded into the Java virtual machine (JVM) by the ClassLoader at runtime. When a .class file is loaded, the JVM will generate a Class object for it. The object we instantiate through new in the program is actually It is constructed based on the corresponding Class object at runtime. To be precise, this Class object is actually an instance of the java.lang.Class generic class. For example, the Class object is a Class instance that encapsulates the definition information of the MyClass class. Since the java.lang.Class class does not have a public constructor, we cannot instantiate this class directly. We can obtain a Class object through the following method.

In the following explanation, we will take the People class and the Student class as examples:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

public class People {

      private String name;

      private int age;

      public People(String name, int age) {

          this.name = name;

              this.age = age;

      }

      public int getAge() {

          return age;

      }

      public String getName() {

          return name;

      }

      public void setAge(int age) {

          this.age = age;

      }

      public void setName(String name) {

          this.name = name;

      }

      public void speak() {

        System.out.println(getName() + " " + getAge());

     }

}

  

public class Student extends People {

  private int grade;

  public Student(String name, int age) {   

    super(name, age); 

  }

  public Student(String name, int age, int grade) {

    super(name, age);           

    this.grade = grade; 

  }     

  public int getGrade() {  

    return grade; 

  }    

  public void setGrade(int grade) {  

    this.grade = grade; 

  }   

  private void learn(String course) {   

    System.out.println(name + " learn " + course); 

  }

}

Copy after login

Get the Class object through the class name

If you know a class at compile time name, we can get its Class object like this:

1

Class<People> peopleClass = People.class;

Copy after login

There is also a method to get the Class object based on the full path name of the class as follows:

1

2

//假设People类在com.test包中

Class<People> peopleClass = Class.forName("com.test.People");

Copy after login

Note that Class.forName() The method parameter must be the full pathname of a class. In fact, as long as we "import com.test.People", we can directly obtain his Class object through "People.class" without the trouble of writing out the full path. (If the corresponding class is not found on the classpath when calling the Class.forName() method, ClassNotFoundException will be thrown.)

Get the Class object through the object itself

1

2

People people = new People("Bill", 18);

Class<People> peopleClass = people.getClass();

Copy after login

Get the class through reflection The constructor

Once we obtain the Class object of People, we can obtain the original definition information of the People class through this Class object. First, let's get the constructor object of the People class. With this constructor object, we can construct a People object. For example, we can add the following code to Student.java:

1

2

3

4

5

6

7

8

9

public static void main(String[] args) {  

  Class<People> pClass = People.class;  

  try {  

    Constructor<People> constructor = pClass.getConstructor(String.class, int.class);    

    People people = constructor.newInstance("Bill", 18);                

    people.speak(); 

  } catch (Exception e) { 

  }

}

Copy after login

Above, we call the getConstructor method to obtain a constructor object of the People class, because the formal parameter type of the constructor we want to obtain is String and int, so we pass in String.class and int.class. With the constructor object, we can call the newInstance method to create a people object.

Note that after obtaining the Constructor, Method, and Field objects of a class through reflection, before calling the methods of these objects, first set the accessible flag of this object to true to cancel the Java language access check. You can Increase reflection speed. As shown in the following code:

1

2

3

4

Constructor<People> constructor = peopleClass.getConstructor(String.class

    int.class);

// 设置 constructor 的 Accessible属性为ture以取消Java的访问检查

constructor.setAccessible(true);

Copy after login

Get the methods declared in the class through reflection

Get the methods declared in the current class (excluding those inherited from the parent class)

To get all the methods declared in the current class, you can use the getDeclaredMethods function in Class. It will get all the methods declared in the current class (including private, public, static, etc.), and it will return an array of Method objects, where Each Method object represents a method declared in a class. To get the specified method, you can call getDeclaredMethod(String name, Class... parameterTypes). As shown in the following code:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

private static void showDeclaredMethods() { 

  Student student = new Student("Bill", 18);  

  //获取Student类声明的所有方法

  Method[] methods = student.getClass().getDeclaredMethods();      

   try {     

      //获取learnMethod对象(封装了learn方法)

      Method learnMethod = student.getClass().getDeclaredMethod("learn",

          String.class);               

      //获取learn方法的参数列表并打印出来

      Class<?>[] paramClasses = learnMethod.getParameterTypes() ;       

      for (Class<?> class : paramClasses) {     

        System.out.println("learn方法的参数: " + class.getName());   

      }               

      //判断learn方法是否为private

      System.out.println(learnMethod.getName() + " is private "

          + Modifier.isPrivate(learnMethod.getModifiers()));  

      //调用learn方法   

      learnMethod.invoke(student, "Java Reflection"); 

    } catch (Exception e) { 

  }

}

Copy after login

Get the public methods declared in the current class and the parent class

To get all the public methods declared in the current class and the parent class, you can call the getMethods function, and to To obtain a specified public method, you can call the getMethod method. Please look at the following code:

1

2

3

4

5

6

7

8

9

10

private static void showMethods() {

  Student student = new Student("mr.simple");   

  // 获取所有public方法(包括Student本身的和从父类继承来的) 

  Method[] methods = student.getClass().getMethods();  

  try {   

    //注意,通过 getMethod只能获取public方法,若尝试获取private方法则会抛出异常

    Method learnMethod = student.getClass().getMethod("learn", String.class);

  } catch (Exception e) { 

  }

}

Copy after login

Get the properties defined in the class through reflection

Getting properties is similar to getting methods, except that the call to getMethods() / getDeclaredMethods() method is replaced Becomes a call to the getFields() / getDeclaredFields() method.

Get the attributes defined in the current class (excluding attributes inherited from the parent class)

To get all the attributes defined in the current class (including private, public, static and other attributes ) You can call the getDeclaredFields function of the Class object; to obtain the specified attributes, you can call getDeclaredField. As shown in the following code:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

private static void showDeclaredFields() {  

  Student student = new Student("Bill", 18);   

  // 获取当前类中定义的所有属性 

  Field[] fields = student.getClass().getDeclaredFields();  

  try {   

    // 获取指定的属性

    Field gradeField = student.getClass().getDeclaredField("grade");

    // 获取属性值

    System.out.println("The grade is : " + gradeField.getInt(student));   

    // 设置属性值   

    gradeField.set(student, 10);

   } catch (Exception e) {

  }

}

Copy after login

Get the public properties defined in the current class and the parent class

To get all the public properties defined in the current class and the parent class, you can call the getFields function of the Class object , and to obtain a specified public attribute, you can call the getField method, as shown in the following code:

1

2

3

4

5

private static void showFields() { 

  Student student = new Student("Bill", 18);           

  // 获取当前类和父类的所有public属性

  Field[] publicFields = student.getClass().getFields();       

}

Copy after login

Get the parent class of the class and the interface implemented by the class through reflection

获取父类

调用Class对象的getSuperClass方法即可,如以下代码所示:

1

2

Student student = new Student("Bill", 18);

Class<?> superClass = student.getClass().getSuperclass();

Copy after login

获取所实现的接口

要知道一个类实现了哪些接口,只需调用Class对象的getInterfaces方法,如以下代码所示:

1

2

3

4

private static void showInterfaces() {

  Student student = new Student("Bill", 19);

  Class<?>[] interfaces = student.getClass().getInterfaces();

}

Copy after login

The above is the detailed content of How to understand java reflection. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Smith Number in Java Smith Number in Java Aug 30, 2024 pm 04:28 PM

Guide to Smith Number in Java. Here we discuss the Definition, How to check smith number in Java? example with code implementation.

Java Spring Interview Questions Java Spring Interview Questions Aug 30, 2024 pm 04:29 PM

In this article, we have kept the most asked Java Spring Interview Questions with their detailed answers. So that you can crack the interview.

Break or return from Java 8 stream forEach? Break or return from Java 8 stream forEach? Feb 07, 2025 pm 12:09 PM

Java 8 introduces the Stream API, providing a powerful and expressive way to process data collections. However, a common question when using Stream is: How to break or return from a forEach operation? Traditional loops allow for early interruption or return, but Stream's forEach method does not directly support this method. This article will explain the reasons and explore alternative methods for implementing premature termination in Stream processing systems. Further reading: Java Stream API improvements Understand Stream forEach The forEach method is a terminal operation that performs one operation on each element in the Stream. Its design intention is

TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

Guide to TimeStamp to Date in Java. Here we also discuss the introduction and how to convert timestamp to date in java along with examples.

Java Program to Find the Volume of Capsule Java Program to Find the Volume of Capsule Feb 07, 2025 am 11:37 AM

Capsules are three-dimensional geometric figures, composed of a cylinder and a hemisphere at both ends. The volume of the capsule can be calculated by adding the volume of the cylinder and the volume of the hemisphere at both ends. This tutorial will discuss how to calculate the volume of a given capsule in Java using different methods. Capsule volume formula The formula for capsule volume is as follows: Capsule volume = Cylindrical volume Volume Two hemisphere volume in, r: The radius of the hemisphere. h: The height of the cylinder (excluding the hemisphere). Example 1 enter Radius = 5 units Height = 10 units Output Volume = 1570.8 cubic units explain Calculate volume using formula: Volume = π × r2 × h (4

PHP vs. Python: Understanding the Differences PHP vs. Python: Understanding the Differences Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHP is suitable for web development, with simple syntax and high execution efficiency. 2. Python is suitable for data science and machine learning, with concise syntax and rich libraries.

PHP: A Key Language for Web Development PHP: A Key Language for Web Development Apr 13, 2025 am 12:08 AM

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

Create the Future: Java Programming for Absolute Beginners Create the Future: Java Programming for Absolute Beginners Oct 13, 2024 pm 01:32 PM

Java is a popular programming language that can be learned by both beginners and experienced developers. This tutorial starts with basic concepts and progresses through advanced topics. After installing the Java Development Kit, you can practice programming by creating a simple "Hello, World!" program. After you understand the code, use the command prompt to compile and run the program, and "Hello, World!" will be output on the console. Learning Java starts your programming journey, and as your mastery deepens, you can create more complex applications.

See all articles