HomeOur Team
Reflection breaks encapsulation trong lập trình hướng đối tượng
Articles
Reflection breaks encapsulation trong lập trình hướng đối tượng
hung.nguyen
hung.nguyen
March 24, 2021
1 min

Trước tiên chúng ta tìm hiểu bốn thuộc tính cơ bản( trong bài viết này tôi sẽ phân tích thuộc tính Encapsulation) của lập trình hướng đối tượng và reflection trong java

A) Bốn thuộc tính quan trọng của lập trình hướng đối tượng:

1- Tính đóng gói (Encapsulation).

  • Được hiểu là giới hạn phạm vi truy cập của phương thức, thuộc tính bên ngoài class. ví dụ nếu tôi khai báo một method có phạm vi truy cập là private thì phương thức này không thể truy cập ngoài class đó được

2- Tính kế thừa (Inheritance)

3- Tính đa hình (Polymorphism)

4- Tính trừu tượng (Abstraction)

B) Reflection là cách thức để truy cập thông tin đối tượng ở thời điểm chạy[runtime](method, private, …)

Trước tiên chúng ta phân tích ví dụ sau:

Cấu trúc project:

unti3tled

Chúng ta có 2 files code như sau:

package com.company;

public class Student {
    private String fullName;

    public String getFullName() {
        return fullName;
    }

    private void setFullName(String fullName) {
        this.fullName = fullName;
    }
}
package com.company;

import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) {
        try {
            accessPrivateMethod();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    static void accessPrivateMethod() throws Exception {
        Class c = Student.class;
        Object obj = c.newInstance();
        Method m = c.getDeclaredMethod("setFullName", String.class);
        m.setAccessible(true);
        m.invoke(obj, "avalue");
        Student st = (Student) obj;
        System.out.println("Value:" + st.getFullName());
    }
}

Kết quả chạy chương trình trên:

Như ta thấy trong lớp Student.java

   private void setFullName(String fullName) {
        this.fullName = fullName;
    }

là private do đó chúng ta sẽ không thể call được method này ở các class khác(theo nguyên lý Encapsulation). Nhưng nó chúng ta có một cách là sử dụng reflection để call nó ở 1 class khác như trong demo.

Như ví dụ demo chúng ta thấy chúng ta có thể call được private method ở các lớp khác? và do đó tính Encapsulation đã bị phá vỡ?

Câu trả lời là đúng vậy.

Tuy nhiên chúng ta nên xem sét kỹ hơn một chút:

Bốn nguyên lý của OOP là cách thức chúng ta design các classes của chúng ta

Còn Reflection là chúng ta đã sử dụng 1 tool để cố tính break nó(Encapsulation )

C) Ứng dụng của Reflection

Reflection được ứng dụng rất nhiều trong các framework ví dụ như JPA, Hibernate,…

Một trong các ứng dụng của reflection mà tôi đã sử dụng đó là viết các unitest cho các private method

package com.company;

import junit.framework.TestCase;
import org.junit.Test;

import java.lang.reflect.Method;

public class StudentTest extends TestCase {


    @Test
    public void testPrivateMethod() throws Exception{
        assertEquals("NewValue", accessPrivateMethod().getFullName());
    }

    private Student accessPrivateMethod() throws Exception {
        Class c = Student.class;
        Object obj = c.newInstance();
        Method m = c.getDeclaredMethod("setFullName", String.class);
        m.setAccessible(true);
        m.invoke(obj, "NewValue");
        Student st = (Student) obj;
        return st;
    }
}

Kết quả chạy unitest

untifftled


Tags

202103oopjavacore
hung.nguyen

hung.nguyen

Developer

Related Posts

Garbage collector – Trình thu gom rác trong java
Garbage collector – Trình thu gom rác trong java
April 06, 2021
3 min
© 2021, All Rights Reserved.

Quick Links

HomeOur Team

Social Media