一直以来,Java初学者甚至有多年开发经验的人,都认为在该类的外部,是不能访问其私有属性的。其实不然,下面是我写的一个很小的例子来证明这一点:
package com.active.demo;
import java.lang.reflect.Field;
public class PrintUtil {
/**
* this method can print all the not-null value of fields that the given object has.
* @param obj: any object that you want to print
*/
public static void print(Object obj) {
try {
//get the object's class
Class clazz = obj.getClass();
//get all the fields that this object has
Field[] fields = clazz.getDeclaredFields();
String fieldName = "";
Object fieldValue;
if (fields != null && fields.length > 0) {
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
//if and only if we set accessible to true,
//we can access all fields, no matter which scope it is
field.setAccessible(true);
fieldValue = field.get(obj);
if (fieldValue != null) {
fieldName = field.getName();
System.out.println(fieldName + ":\t\t" + fieldValue);
}
}
}
} catch (Exception e) {
throw new RuntimeException("can not print ["
+ obj.getClass().getName() + "] field");
}
}
//this is for test
public static void main(String[] args) {
TestPrintBean tpb = new TestPrintBean();
tpb.setPriveteField("this is a value of private field");
tpb.setProtectedField("this is a value of protected field");
tpb.setPublicField("this is a value of public field");
print(tpb);
}
-----------------------------------------------------
This is a bean object just for testing
-----------------------------------------------------
package com.active.demo;
public class TestPrintBean{
private String priveteField;
private String priveteField2;
protected String protectedField;
public String publicField;
/**
* @return the priveteField
*/
public String getPriveteField() {
return priveteField;
}
/**
* @param priveteField the priveteField to set
*/
public void setPriveteField(String priveteField) {
this.priveteField = priveteField;
}
/**
* @return the priveteField2
*/
public String getPriveteField2() {
return priveteField2;
}
/**
* @param priveteField2 the priveteField2 to set
*/
public void setPriveteField2(String priveteField2) {
this.priveteField2 = priveteField2;
}
/**
* @return the protectedField
*/
public String getProtectedField() {
return protectedField;
}
/**
* @param protectedField the protectedField to set
*/
public void setProtectedField(String protectedField) {
this.protectedField = protectedField;
}
/**
* @return the publicField
*/
public String getPublicField() {
return publicField;
}
/**
* @param publicField the publicField to set
*/
public void setPublicField(String publicField) {
this.publicField = publicField;
}
}
}
分享到:
相关推荐
在Java中,私有方法和私有属性通常不允许外部类直接访问,这是为了保护类的封装性。然而,通过反射机制,我们可以绕过这些限制。以下是如何使用Java反射来调用私有方法并获取私有属性值的详细步骤: 1. **获取Class...
为了访问私有字段,我们需要调用`setAccessible(true)`方法,使得我们可以绕过Java的访问控制规则。 ```java for (Field field : fields) { if ("myPrivateField".equals(field.getName())) { field....
// 访问私有属性 instance.#privateProp; // 报错,无法直接访问 ``` 3. **块级作用域**:在ES6中,`let`和`const`关键字的引入也让我们能更好地管理私有变量,因为它们具有块级作用域,只在声明它们的代码块内...
例如,`Method`类的`setAccessible(true)`方法可以将某个方法或字段设置为可访问,从而可以调用私有方法或修改私有属性。这在测试、调试或者特定场景下很有用,但也要谨慎使用,因为它破坏了封装性,可能引入安全...
#### 三、访问私有属性 尽管Python中的私有属性看起来无法从类的外部直接访问,但实际上可以通过特殊的方法进行访问: ```python file_A = File("file_A") print(file_A._File__code) # 可以打印出私有属性__code的...
要求为两个私有属性提供public 的访问方法。并提供个两构造方法,一个无参,默认给name赋值为AAA,给legs赋值为4;另一个需要两个参数,分别用这两个参数给私有属性赋值。要求在第一个构造方法中调用第二个构造方法。...
同样,访问私有字段也是类似的步骤,使用`Field`类来获取字段对象,然后通过`setAccessible(true)`改变访问权限,最后用`get()`或`set()`方法操作字段: ```java Field privateField = personClass....
在Python中,并没有真正意义上的私有属性或方法,即不存在如Java等面向对象语言中的`private`关键字来完全禁止外部访问。Python采用了一种约定性的命名方式来达到类似的效果,这种机制被称为“伪私有”。 ##### 2.1...
在Java中,反射机制主要用于以下几种情况:动态加载类、访问私有成员、运行时检查类型以及调用私有方法等。 标题“Java反射机制修改私有成员变量的实现_Reflection”着重讲述了如何利用反射来修改私有成员变量的值...
这些规则包括具有公共getter和setter方法,无参数构造器以及属性为私有等。Java Bean遍历是获取并操作Bean对象属性的过程,而注解是现代Java中用于元数据的一种方式,可以给Bean的属性添加额外的信息或行为。 在...
// 允许访问私有属性 try { Object oldValue = field.get(oldObj); Object newValue = field.get(newObj); // 比较属性值 if (!Objects.equals(oldValue, newValue)) { diffResults.put(field.getName(),...
在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类信息等。本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解...
本示例中的"实体对象属性动态化(私有属性来源为map)"是一个具体的应用场景,它利用Map来存储实体类的私有属性,从而实现属性的动态添加、修改和访问。下面我们将详细探讨这一技术。 1. **Map接口**:在Java中,Map...
3. **反射机制**:Java的反射API允许在运行时动态地获取类的信息,包括私有属性。但这是一种较为复杂的操作,通常不建议在常规编程中使用。 **示例代码:** ```java public class Parent { public int parentAttr ...
在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细...
由于私有方法在外部不可见,我们需要使用`getDeclaredMethod`而不是`getMethod`,并且可能需要设置访问权限: ```java Method privateMethod = MyClass.class.getDeclaredMethod("myPrivateMethod"); privateMethod...
与C++和Java不同,Python并没有严格意义上的访问修饰符,而是通过约定俗成的方式来实现私有属性和方法。私有属性和方法主要是为了保护数据的完整性,防止外部随意访问和修改,确保对象的内部状态不会被破坏。 私有...
Java 私有构造器是 Java 编程语言中的一种特殊的构造器,它使用 private 关键字声明,以控制访问权限。私有构造器的主要作用是阻止对象的生成,防止类被实例化和子类化。通过私有构造器,可以实现 Singleton 属性,...
编写Student类,类中包含学生姓名,学号等私有数据成员。 使用JAVA反射机制修改一个学生对象的私有数据成员(不允许调用setters)
我们知道JS中私有属性的实现本质就是 var + closure。如下 代码如下:function Person(n, a){ // public this.name = n; // private var age = a; this.getName = function(){ return this.name; } this.getAge = ...