今天看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 field.setAccessible(true); field.set(obj, newValue); ``` 总结来说,Java反射提供了一种动态操控Java对象的能力,允许我们在运行时发现和改变类的行为。虽然...
此外,反射可以访问私有成员,这可能会破坏封装性,增加代码的不安全性。 总结一下,Java反射机制为我们提供了在运行时检查和操作类、方法的能力。通过`Class.forName()`获取Class对象,再利用`getMethod()`获取...
- **安全性问题**:可能破坏封装性,导致安全漏洞。 - **可读性**:使用反射的代码可能难以理解和调试。 #### 四、反射的应用场景 Java反射机制在许多场景下都有广泛的应用: - **框架设计**:Spring框架利用...
- 安全风险:反射可以访问私有成员,可能破坏封装性,引入安全问题。 - 难以调试:反射代码通常更复杂,调试起来比较困难。 四、使用反射的最佳实践 1. 尽量减少反射的使用:只在确实需要动态行为时使用反射,避免...
2. **安全性问题**:反射可以访问私有成员,这可能破坏封装性和安全性。 3. **可维护性**:过度使用反射会降低代码的可读性和可维护性。 #### 六、总结 Java反射机制是Java语言的一项重要特性,它使得程序能够在...
2. 安全风险:反射可以访问私有成员,可能破坏封装性,增加代码的不稳定性。 3. 代码复杂性:过度使用反射会使代码变得难以理解和维护。 五、源代码学习 对于学习Java反射,阅读和理解相关的源代码是非常有益的。...
安全性问题,反射可以访问私有成员,可能破坏封装性;编译器无法检查反射代码的错误。 7. **注意事项** - 使用反射时应尽量避免对性能敏感的代码,因为它涉及类加载、查找方法等操作,相对普通代码执行速度较慢。 ...
了解了Java反射和动态代理的基本概念后,实践中我们需要谨慎使用,因为它们会带来一定的性能开销,并可能破坏封装性。然而,只要合理运用,它们能极大地提高代码的灵活性和可扩展性,是Java开发中的利器。 在提供的...
虽然Java反射机制功能强大,但在实际开发中应谨慎使用,因为它可能破坏封装性,降低程序的可读性和可维护性,还可能带来安全性和性能问题。在非必要情况下,避免使用反射机制,优先考虑其他设计模式和编程技巧。 ...
- 反射可能会破坏封装性,应合理控制其使用范围。 通过以上讲解,我们可以看到Java反射虽然强大,但也需要谨慎使用。在理解了反射的基本原理和用法后,开发者可以灵活应对各种复杂场景,如动态加载类、处理未知...
反射允许我们访问类的私有属性,这在某些场景下非常有用,但同时也破坏了封装性。 1. **获取属性**: - 使用`getDeclaredField(String fieldName)`方法获取指定名称的字段。 - 对于私有字段,需要调用`...
然而,由于反射操作可能会破坏封装性,因此在实际开发中应谨慎使用,避免引入安全风险和性能问题。学习并理解反射机制,可以帮助我们更好地掌握Java的灵活性,并在某些场景下实现更高效、更通用的解决方案。
此外,由于反射可以访问私有成员和调用非公开的方法,如果不加以控制,可能会破坏封装性,增加代码的复杂性和潜在的安全风险。 代理模式是设计模式中的一种,主要用来在不修改原有对象的情况下,为对象添加额外功能...
2. 安全风险:反射可以访问私有成员,可能破坏封装性,增加代码的不安全性。 3. 难以调试:反射代码通常较复杂,使得问题定位和调试变得困难。 总结,Java 反射机制是一种强大的工具,能够提升程序的灵活性和可扩展...
- 访问私有成员:通过反射可以绕过访问控制,访问私有字段和方法,但这通常应谨慎使用,因为可能破坏封装性。 - 序列化和反序列化:在实现序列化时,反射用于获取对象的字段并写入或读取。 - 框架和库的实现:...
使用反射可能会破坏封装性,增加代码复杂性,降低程序性能(因为反射操作比直接调用方法慢)。因此,在生产环境中应谨慎使用,尽量避免过度依赖反射。 9. **设计模式应用**:反射机制在一些设计模式中得到应用,如...
它可能会破坏封装性,导致安全风险。此外,由于反射操作比直接调用方法和字段慢,因此在性能敏感的代码中应谨慎使用。 10. **最佳实践**:在实际开发中,应尽量减少反射的使用,只在确实需要动态行为或元数据时才...
由于反射可以访问私有成员和执行未公开的操作,如果不小心使用,可能会破坏封装性和安全性。因此,在使用反射时,需要谨慎评估其必要性和潜在影响。 总之,Java反射机制是Java语言中一个强大的工具,它增强了Java的...
8. **安全性与性能**:解释反射带来的安全风险,如破坏封装性,以及性能上的影响。 9. **应用示例**:可能包括动态代理、配置文件驱动的代码、插件系统等实际应用场景。 接下来,代码示例部分可能会包含以下内容:...