`
xupo
  • 浏览: 216585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Java反射破坏封装的问题

 
阅读更多

今天看ITEYE,一片关于Java反射破话封装的问题,摘录如下:

一般情况下,我们并不能对类的私有字段进行操作,利用反射也不例外,但有的时候,例如要序列化的时候,我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种访问,而由于反射类中的Field,Method和Constructor继承自AccessibleObject,因此,通过在这些类上调用setAccessible()方法,我们可以实现对这些字段的操作。但有的时候这将会成为一个安全隐患,为此,我们可以启用java.security.manager来判断程序是否具有调用setAccessible()的权限。默认情况下,内核API和扩展目录的代码具有该权限,而类路径或通过URLClassLoader加载的应用程序不拥有此权限 。

 

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 = "zhong_gang";   
  
    private User(Integer id) {   
        this.id = id;   
    }   
  
    private User(int number) {   
        this.number = number;   
    }   
  
    protected User(String name) {   
        this.name = name;   
    }   
  
    private User(Integer id, String name) {   
        this.id = id;   
        this.name = name;   
    }   
  
    public User() {   
  
    }   
  
    public String upperName() {   
        return name.toUpperCase();   
    }   
  
    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;   
import java.lang.reflect.Field;   
import java.lang.reflect.Method;   
  
/**  
 * Created by IntelliJ IDEA.  
 * User: Zhong Gang  
 * Date: 11-9-24  
 * Time: 下午7:03  
 */  
public class UserRelectionTest extends TestCase {   
  
    public void testIntegerReflection() 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());   
    }   
  
    public void testFiledReflection() throws Exception {   
        Class<User> clazz = User.class;   
        Field id = clazz.getDeclaredField("id");   
        id.setAccessible(true);   
        User user = new User();   
        id.set(user, Integer.valueOf("3"));   
        assertEquals(Integer.valueOf("3"), user.getId());   
    }   
  
    public void testMethodReflection() throws Exception {   
        Class<User> clazz = User.class;   
        Method method = clazz.getDeclaredMethod("upperName");   
//        method.setAccessible(true);   
        User user = new User();   
        String invoke = (String) method.invoke(user);   
        assertEquals("ZHONG_GANG", invoke);   
    }   
}  

 

另一篇关于反射int.class 与 Integer.class的:

 

http://www.iteye.com/problems/72276

分享到:
评论

相关推荐

    java反射,获取所有属性、方法以及List集合类

    这需要谨慎使用,因为可能破坏封装性。 ```java field.setAccessible(true); field.set(obj, newValue); ``` 总结来说,Java反射提供了一种动态操控Java对象的能力,允许我们在运行时发现和改变类的行为。虽然...

    java 反射得到某个方法

    此外,反射可以访问私有成员,这可能会破坏封装性,增加代码的不安全性。 总结一下,Java反射机制为我们提供了在运行时检查和操作类、方法的能力。通过`Class.forName()`获取Class对象,再利用`getMethod()`获取...

    反射实例-JAVA反射机制

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

    JAVA反射详细讲解

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

    java 反射机制例子

    2. **安全性问题**:反射可以访问私有成员,这可能破坏封装性和安全性。 3. **可维护性**:过度使用反射会降低代码的可读性和可维护性。 #### 六、总结 Java反射机制是Java语言的一项重要特性,它使得程序能够在...

    java反射源代码

    2. 安全风险:反射可以访问私有成员,可能破坏封装性,增加代码的不稳定性。 3. 代码复杂性:过度使用反射会使代码变得难以理解和维护。 五、源代码学习 对于学习Java反射,阅读和理解相关的源代码是非常有益的。...

    JAVA 反射机制应用

    安全性问题,反射可以访问私有成员,可能破坏封装性;编译器无法检查反射代码的错误。 7. **注意事项** - 使用反射时应尽量避免对性能敏感的代码,因为它涉及类加载、查找方法等操作,相对普通代码执行速度较慢。 ...

    Java 反射-动态代理

    了解了Java反射和动态代理的基本概念后,实践中我们需要谨慎使用,因为它们会带来一定的性能开销,并可能破坏封装性。然而,只要合理运用,它们能极大地提高代码的灵活性和可扩展性,是Java开发中的利器。 在提供的...

    Java反射机制Demo

    虽然Java反射机制功能强大,但在实际开发中应谨慎使用,因为它可能破坏封装性,降低程序的可读性和可维护性,还可能带来安全性和性能问题。在非必要情况下,避免使用反射机制,优先考虑其他设计模式和编程技巧。 ...

    JAVA反射简单例子

    - 反射可能会破坏封装性,应合理控制其使用范围。 通过以上讲解,我们可以看到Java反射虽然强大,但也需要谨慎使用。在理解了反射的基本原理和用法后,开发者可以灵活应对各种复杂场景,如动态加载类、处理未知...

    java反射.pdf

    反射允许我们访问类的私有属性,这在某些场景下非常有用,但同时也破坏了封装性。 1. **获取属性**: - 使用`getDeclaredField(String fieldName)`方法获取指定名称的字段。 - 对于私有字段,需要调用`...

    Java反射简单例子

    然而,由于反射操作可能会破坏封装性,因此在实际开发中应谨慎使用,避免引入安全风险和性能问题。学习并理解反射机制,可以帮助我们更好地掌握Java的灵活性,并在某些场景下实现更高效、更通用的解决方案。

    java反射机制PPT

    此外,由于反射可以访问私有成员和调用非公开的方法,如果不加以控制,可能会破坏封装性,增加代码的复杂性和潜在的安全风险。 代理模式是设计模式中的一种,主要用来在不修改原有对象的情况下,为对象添加额外功能...

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

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

    java反射.ppt

    - 访问私有成员:通过反射可以绕过访问控制,访问私有字段和方法,但这通常应谨慎使用,因为可能破坏封装性。 - 序列化和反序列化:在实现序列化时,反射用于获取对象的字段并写入或读取。 - 框架和库的实现:...

    java反射原理详解

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

    Java反射机制(推荐)

    它可能会破坏封装性,导致安全风险。此外,由于反射操作比直接调用方法和字段慢,因此在性能敏感的代码中应谨慎使用。 10. **最佳实践**:在实际开发中,应尽量减少反射的使用,只在确实需要动态行为或元数据时才...

    候捷谈Java反射机制

    由于反射可以访问私有成员和执行未公开的操作,如果不小心使用,可能会破坏封装性和安全性。因此,在使用反射时,需要谨慎评估其必要性和潜在影响。 总之,Java反射机制是Java语言中一个强大的工具,它增强了Java的...

    java 反射ppt 和 code 示例

    8. **安全性与性能**:解释反射带来的安全风险,如破坏封装性,以及性能上的影响。 9. **应用示例**:可能包括动态代理、配置文件驱动的代码、插件系统等实际应用场景。 接下来,代码示例部分可能会包含以下内容:...

Global site tag (gtag.js) - Google Analytics