`
Wind_ZhongGang
  • 浏览: 263757 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

问题:使用反射是否破坏了程序的封装性

    博客分类:
  • Java
阅读更多

  今天看到问答里有人发了一个关于反射的问题,是如何利用反射来获取类的私有构造函数并进行类的实例化的,由此想到Java提供private关键字就是用来控制类的成员变量和方法在外部无法可见,那么使用反射能够获取到类的私有构造函数,成员变量和方法,并对其进行操作,那么这样做是否破坏了程序的封装性呢?

 

  有人说无法实现访问调用私有的构造函数,再次实践证明。

 

 


package com.dream.reflection;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-9-24
 * Time: 下午7:02
 */
public class User {
    private Integer id;
    private int number;
    private String name;

    private User(Integer id) {
        this.id = id;
    }

    private User(int number) {
        this.number = number;
    }

    private User(String name) {
        this.name = name;
    }

    private User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getNumber() {
        return number;
    }
}

 

 

 


package com.dream.reflection;

import junit.framework.TestCase;

import java.lang.reflect.Constructor;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-9-24
 * Time: 下午7:03
 */
public class UserRelectionTest extends TestCase {

    public void testConstructorReflection() throws Exception {
        Class<User> clazz = User.class;
        Constructor<User> constructor = clazz.getDeclaredConstructor(Integer.class);
        constructor.setAccessible(true);
        User user = constructor.newInstance(Integer.valueOf("1"));
        assertEquals(Integer.valueOf("1"), user.getId());
    }

    public void testIntReflection() throws Exception {
        Class<User> clazz = User.class;
        Constructor<User> constructor = clazz.getDeclaredConstructor(int.class);
        constructor.setAccessible(true);
        User user = constructor.newInstance(1);
        assertEquals(1, user.getNumber());
    }

    public void testStringReflection() throws Exception {
        Class<User> clazz = User.class;
        Constructor<User> constructor = clazz.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        User user = constructor.newInstance("ZhongGang");
        assertEquals("ZhongGang", user.getName());
    }
}
 
分享到:
评论
1 楼 fushcpc 2013-04-13  
还较上真了

相关推荐

    Java EE:Reflect 反射技术.docx

    - 安全性:反射可以访问私有成员,但这也可能导致安全问题,因为它破坏了封装性。 - 性能:反射操作通常比直接调用方法或访问属性慢,因此在性能敏感的代码中应谨慎使用。 - 错误处理:反射操作可能会抛出异常,如`...

    java r反射源代码

    使用反射可能会破坏封装性和安全性,因为它可以访问私有成员。因此,反射应当在充分理解风险后谨慎使用,特别是在编写公共API或服务时。 8. 应用场景: - 插件系统:动态加载和调用插件中的类和方法。 - 测试...

    反射实例-JAVA反射机制

    - **安全性问题**:可能破坏封装性,导致安全漏洞。 - **可读性**:使用反射的代码可能难以理解和调试。 #### 四、反射的应用场景 Java反射机制在许多场景下都有广泛的应用: - **框架设计**:Spring框架利用...

    反射实例-JAVA反射机制.doc

    2. 安全风险:反射可以访问私有成员,可能破坏封装性,增加代码的不安全性。 3. 难以调试:反射代码通常较复杂,使得问题定位和调试变得困难。 总结,Java 反射机制是一种强大的工具,能够提升程序的灵活性和可扩展...

    Java基础 反射篇.md

    1. **破坏类的封装性**:反射可以访问私有成员,破坏了封装性。 2. **性能损耗**:反射涉及查找类信息、创建实例等操作,比直接调用要慢得多。 3. **安全性问题**:过度使用反射可能导致安全漏洞。 ### 反射基础篇...

    JAVA反射详细讲解

    - 安全风险:反射可以访问私有成员,可能破坏封装性,引入安全问题。 - 难以调试:反射代码通常更复杂,调试起来比较困难。 四、使用反射的最佳实践 1. 尽量减少反射的使用:只在确实需要动态行为时使用反射,避免...

    JAVA反射机制

    - **安全问题**:反射可能破坏封装性,导致潜在的安全漏洞。 - **代码可读性和维护性降低**:大量使用反射可能导致代码难以理解和维护。 #### 五、结论 反射是JAVA的一个重要特性,它为开发者提供了在运行时操作类...

    java反射

    - 反射可能会破坏封装性,不恰当使用可能导致代码难以理解和维护。 8. **应用场合**: - 插件系统:通过反射加载未知插件的类并调用其功能。 - ORM框架:如Hibernate,通过反射映射数据库记录到Java对象。 - ...

    类的反射机制您的网络连接,请

    2. 安全风险:反射可以访问私有成员,可能会破坏封装性,增加代码的不稳定性。 3. 类型安全性:反射可能导致类型转换异常,因为它是基于字符串来查找和调用成员的。 4. 编程复杂性:过度使用反射会使代码变得复杂...

    pdf反射机制-java

    - 安全性:反射可以访问私有成员,可能破坏封装性,导致安全风险。 - 易用性:过度使用反射可能会使代码变得难以理解和维护。 因此,在实际开发中,我们需要根据需求谨慎使用反射机制,充分利用其优点,同时避免...

    反射学习PPT + TEST CODE

    - 安全风险:过度使用反射可能破坏封装性,导致安全问题。 - 易出错:反射代码更复杂,调试难度增加。 总的来说,“反射学习PPT + TEST CODE”是一份针对C#反射机制的教育材料,通过理论讲解和实际代码,帮助初学者...

    java反射示例代码

    - 反射可以访问私有成员,但可能破坏封装性,应谨慎使用。 8. **实际应用**: - ORM框架(如Hibernate):通过反射将数据库记录映射为Java对象。 - AOP(面向切面编程):动态代理、织入切面。 - 动态代理:...

    Java中的反射

    同时,由于反射可能破坏封装性,应尽量限制其使用范围,避免过度依赖。 10. **最佳实践**: 在使用反射时,尽量先判断目标类、方法或字段是否存在,避免空指针异常。在调用私有方法或访问私有字段时,要确保操作的...

    反射的使用

    2. 安全风险:反射可以访问私有成员,可能破坏封装性。 3. 代码复杂性:过多使用反射可能导致代码难以理解和维护。 总结,Java反射是Java动态性的重要体现,它为程序带来了强大的灵活性和扩展性,但也需要注意其...

    java反射原理详解

    使用反射可能会破坏封装性,增加代码复杂性,降低程序性能(因为反射操作比直接调用方法慢)。因此,在生产环境中应谨慎使用,尽量避免过度依赖反射。 9. **设计模式应用**:反射机制在一些设计模式中得到应用,如...

    反射学习笔记

    但是,这可能会破坏封装性,应当谨慎使用。`setAccessible(true)` 方法可以使私有成员可访问。 9. **注解与反射**:通过反射,我们可以读取类、方法或字段上的注解,从而实现基于元数据的编程。`Annotation[] ...

    Java核心知识体系:反射机制详解.pdf

    不当使用反射可能会破坏封装性,增加代码的复杂性和不可预测性。因此,应在需要时谨慎使用,并尽可能优化反射操作。 9. **示例代码** ```java Class&lt;?&gt; clazz = Class.forName("com.example.YourClass"); Your...

    反射机制.rar

    10. **安全性问题**: 反射可以绕过访问控制,这可能引发安全风险,比如破坏封装性。因此,使用反射时应确保对代码的控制和安全性有足够的理解。 综上所述,Java反射机制提供了一种强大的机制,使得程序在运行时能够...

    C#反射参考

    此外,反射可能导致安全性问题,因为它允许访问私有成员,这可能破坏封装性。因此,在使用反射时,应权衡灵活性与性能、安全性的关系,确保正确地平衡它们。 总之,反射是C#中一个强大的工具,它赋予了程序在运行时...

    java反射机制工具类

    在实际应用中,使用反射需要谨慎,因为它可能会破坏代码的封装性和安全性,增加程序的复杂性,并可能导致性能下降。不过,当需要实现动态性、解耦或元编程时,Java反射机制是一个不可或缺的工具。在设计和实现`...

Global site tag (gtag.js) - Google Analytics