- vừa được xem lúc

Gọi phương thức PRIVATE trong JAVA - Reflection API

0 0 22

Người đăng: ledangtuanbk

Theo Viblo Asia

1. Tổng quan

Khi mới học JAVA, các phương thức private được sử dụng để ngăn cản việc gọi từ bên ngoài class. Nhưng vì 1 lý do nào đó, nếu chúng ta muốn sử dụng nó. Để đạt được điều này, chúng ta cần nghiên cứu về Java's access controls. Giúp chúng ta có thể sử dụng được các đoạn trong phương thức private.

2. Cách thực hiện

Ta có 1 hàm thư viện như bên dưới. Đơn giản là cộng 2 số và trả về kết quả. Nó là private method, theo quan điểm thông thường thì chúng ta không thể gọi được nó.

private class MyUtils { private Integer plusNumber(int a, int b){ return a+b; } private static Integer subNumber(int a, int b){ return a-b; } private int var1= 1; private static int var2= 2;
}

Cách 1: Sử dụng Java Reflection API

Nếu chúng ta gọi trực tiếp như thế này, compiler sẽ báo lỗi.

MyUtils.plusNumber(1,2)

Chúng ta sẽ gọi hàm này dựa trên reflection(một số khái niệm mình giữ nguyên tiếng Anh cho đúng bản chất)

Bước 1: Truy cập vào đối tượng Method muốn gọi

 Method indexOfMethod = MyUtils.class.getDeclaredMethod( "plusNumber", int.class, int.class);

Có 3 tham số:

  • plusNumber: Tên hàm
  • 2 tham số tiếp theo là kiểu dữ liệu vủa hàm plusNumber. Trong ví dụ này là 2 biến kiểu int

Bước 2: Cho phép truy cập

indexOfMethod.setAccessible(true);

Bước 3: Thực hiện gọi method

Integer result = (Integer) indexOfMethod.invoke(new MyUtils(), a, b);

hàm invoke cần lưu ý các tham số:

  • Tham số 1: Nếu hàm thông thường thì cần 1 instance của Object (new MyUtils()). Nếu là hàm static thì cần MyUtils.class
  • Các tham số tiếp theo dùng để gọi hàm đó ở ví dụ là 2 biến kiểu int
  • Nhớ ép kiểu về kiểu mong muốn của hàm (Integer)

Cách 2: Sử dụng Spring ReflectionTestUtils

Để thao tác được đến các private method là 1 vấn đề trong testing. Spring's test library cung cấp sẵn các hàm để thực hiện việc này.

 /** * Call non-static method plusNumber using reflection API * @throws Exception */ private static void callMethod() throws Exception { int a = 1; int b = 2; Method indexOfMethod = MyUtils.class.getDeclaredMethod( "plusNumber", int.class, int.class); indexOfMethod.setAccessible(true); Integer result = (Integer) indexOfMethod.invoke(new MyUtils(), a, b); System.out.println(result); } /** * Call static method subNumber using reflection API * @throws Exception */ private static void callMethodStatic() throws Exception{ int a = 10; int b = 2; Method indexOfMethod = MyUtils.class.getDeclaredMethod( "subNumber", int.class, int.class); indexOfMethod.setAccessible(true); Integer result = (Integer) indexOfMethod.invoke(MyUtils.class, a, b); System.out.println(result); }

Trên là 2 ví dụ khi gọi hàm non-static và static. Cách gọi tương tự như sử dụng Reflection API ở mục 2.1

Truy cập vào biến private

Tương tự như method, chúng ta cũng có thể truy cập vào biến private bằng Reflection APISpring ReflectionTestUtils

Reflection API

 /** * Get value of non-static field "var1" using reflection API * @throws Exception */ private static void callField() throws Exception{ Field field = MyUtils.class.getDeclaredField( "var1"); field.setAccessible(true); Integer result = (Integer) field.get(new MyUtils()); System.out.println(result); }

Spring ReflectionTestUtils

 /** * Call non-static variable "var1" using SpringTestUtils library */ private static void springTestCallField(){ Integer value = (Integer) ReflectionTestUtils.getField(new MyUtils(), "var1"); System.out.println(value); }

3. Kết luận

Trong bài viết này, ta đã tìm hiểu Java Reflection API and Spring's ReflectionTestUtils. Biết cách sử dụng trong trường hợp cần thiết. Source code của toàn bộ bài viết xem ở đây

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 302

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 277

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 50

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 194

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 71

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 139