Java利用反射访问对象的私有成员

当我们使用反射为java对象的全部字段逐一赋值的时候,私有字段是不允许直接访问的。

在java.lang.reflect当中,有几个比较实用的API可以解决:

getDeclaredFields()
:获得所有访问级别的字段

setAccessible(boolean flag):
修改类成员的可访问性

下面以一个JavaBean 对象 转 DBObject
对象的方法为例:


    public static DBObject bean2DbObject(DBObject dbObject, PicInfo bean) throws IllegalArgumentException, IllegalAccessException
{
Field[] fields = bean.getClass().getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
field.setAccessible(true);
Object valueObj = field.get(bean);
field.setAccessible(false);

if(valueObj!=null)
{
dbObject.put(fieldName, valueObj);
}
}
return dbObject;
}

Java利用反射访问对象的私有成员

时间: 2024-12-27 19:54:27

Java利用反射访问对象的私有成员的相关文章

通过反射访问父类的私有成员

Java语言中,子类是不能访问父类的私有成员的,包括成员变量和方法,但可以通过Java的反射机制去访问. 其实在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用.就像有些东西你可能拥有,但是你并不能使用.所以子类对象是绝对大于父类对象的,所谓的子类

C++之在类内部访问对象的私有成员

一.引言 今天看项目里的一段代码发现,竟然可以再类的成员函数中访问该类的对象的私有成员.感觉不可思议. 自己写的实例代码: #include <iostream> using namespace std; class CTest { public: CTest(int n) { m_a = n; } CTest(CTest &t) { m_a = t.m_a; } public: void Print() { cout << m_a << endl; } pri

java 利用反射修改对象中的list类型字段中的值。

这两天没事学习下了反射.通过反射我们可以修改对象中的字段的值. 就如下面这段代码 Grade grade=new Grade(); Field f=Grade.class.getDeclaredField("name"); f.setAccessible(true); f.set(grade, "三年级一班"); 这是so easy的,这时我想到了要是list类型的字段该怎么通过反射修改呢. 于是我就尝试了下,最终做了出来. 先准备两个类. public class

通过指针访问C++对象的私有成员

C++对象的私有成员是禁止类外的访问的.但是我们仍然可以通过指针访问C++对象的私有成员. #include <iostream> using namespace std; class A { public: A(int i = 0) :m_i(i) {} void print() { cout << "m_i" << this->m_i << endl; } private: int m_i; }; int main(int ar

Java反射(三)在运行时利用反射分析对象

在运行时利用反射分析对象,其实就是利用反射来获得或者设置类的域.举例如下: 有一个Student类: package testreflection; public class Student { private String stuNum; public Student(String stuNum) { // TODO Auto-generated constructor stub this.stuNum = stuNum; } } 利用反射来获得和设置Student类的stuNum域的测试代码

java利用反射机制判断对象的属性是否为空

java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String>(); validateMap.put("serial", "编号");validateMap.put("major", "专业"); public static <T> String validateFiledIs

C#箴言之用属性来访问类的私有成员

在程序中,难免要访问某个对象的私有成员.那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可:而另一个就是提供公有的成员访问函数来进行访问.那么现在用C#编写程序,就不再需要采用前面所说的两种方法了,而直接使用属性来完成. 首先来看看三种方法的如何实现以及调用的,这里用一个例子来说明,即访问“EmployeeInfo”类的私有成员strName,具体如下表格所示. 那么这三种方法有什么区别呢,用如下的表格,可以更好的说明三者的区别. 因

C#利用反射来判断对象是否包含某个属性的实现方法

本文实例展示了C#利用反射来判断对象是否包含某个属性的实现方法,对于C#程序设计人员来说有一定的学习借鉴价值. 具体实现代码如下: 1 /// <summary> 2 /// 利用反射来判断对象是否包含某个属性 3 /// </summary> 4 /// <param name="instance">object</param> 5 /// <param name="propertyName">需要判断的

泛型约束和利用反射修改对象属性的值

周日了都,昨天休息了一天,今天想想得敲敲代码练习一下,如下关于泛型约束和利用反射修改对象属性的值的, 都挺简单的,呵呵,但时间一长,不经常使用还容易忘记在此就当记录一下了, 首先泛型代码一般是如下的情形: 加了泛型约束,只允许引用类型并且是只能是无参数的构造函数的类型才能传入,也就是不允许给类构造参数传递实参,否则将报错. 错误 1 “XXXXXX.pros”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法“ 1 public static T GetObject<T>(T