Java通过反射可以设置私有变量的好处有哪

Java通过反射可以设置私有变量的好处有哪,第1张

Java通过反射可以设置私有变量的好处有

public class PrivateTest { private String name = "hello"; public String getName() { return name; } } public class ReflectionTest { public static void main(String[] args) throws Exception { PrivateTest pt = new PrivateTest(); Class clazz = PrivateTestclass; Field field = clazzgetDeclaredField("name"); fieldsetAccessible(true); fieldset(pt, "world"); fieldsetAccessible(false); Systemoutprintln(ptgetName()); } } 这样通过反射可以设置私有变量,Java当时设计的时候是出于什么考虑的呢?

但是也有应用的场景,可以想到的是: hibernate中你定义实体类及相应的字段(和数据库表对应),你可以在映射文件中配置: 当你从数据库中获取到数据后,是调用类的setxxx()方法,还是直接给字段赋值,这里字段是可以设置成private的,用的就是反射。那java反射可以设置私有变量的值,是好处多还是坏处多呢? 问题补充:robertliudeqiang 写道提供了一种接口吧,一般情况下不会用的。

但是也有应用的场景,可以想到的是: hibernate中你定义实体类及相应的字段(和数据库表对应),你可以在映射文件中配置: 当你从数据库中获取到数据后,是调用类的setxxx()方法,还是直接给字段赋值,这里字段是可以设置成private的,用的就是反射。目前反射设置private变量的值,还未看出是有好处 的。

那应该是java的一个问题遗留,为了兼容没法解决的。

你需要初始化一个ReflectionPermission对象,并使用MemberAccess的ReflectionPermissionFlag初始化,调用Demand请求权限,如果上下文允许你这么 *** 作不会出现安全问题,代码就不会抛出异常继续执行,你就可以通过反射访问私有成员了

但是提醒你,这么做危险性很大,破坏了类的封装性,建议不要这么 *** 作,调试极其困难

可以看看这个 但是跟反射没什么关系。

利用多态,子类虽然访问不了父类的私有变量,但是可以通过方法访问,see

class a{

private int i = 11;

public void show(){

Systemoutprintln(i);

}

}

class b extends a{

private int j= 12;

public static void main(String[] args){

a aa = new b();

aashow();

}

}

so easy

String path=“comtestB”

Class clazz = ClassforName(path);   //获得b的反射

B b =(B)clazznewInstance();   //前提是b类有个无参构造函数

Method m = clazzgetDeclaredMehod("SetName",Stringclass);

msetAccessible(true);    //不做安全检查,你才可以去访问私有方法

minvoke(b,"哈哈");

这里是给B里面的(下面这个方法进行调用赋值)

private void SetName(String s){}

ps  getDeclaredMehod 是对私有的方法进行调用 要访问必须加setAccessible

    getMehod 是对通用方法进行调用,不用加setAccessible

这是一个很值得探讨的问题,许多人接触反射时,对反射功能之强大都会抱有怀疑,感觉严重破坏了封装的性质。可是,什么是封装,什么是安全呢?

封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。

所谓安全,如果意思是保护实现源码不被别人看见,那没有作用。不用反射也能轻易获取源码。

所以我以为反射机制只是提供了一种强大的功能,使得开发者能在封装之外,按照特定的需要实现一些功能。就好比核技术,虽然造核d很危险吧,但造核电站还是很有用处的(这个比喻似乎不是很恰当,将就将就)。

曾经给朋友讨论过这个问题,感觉解释得不是很清楚,大家一起探讨探讨,看看怎样表述才能更容易理解:)

利用反射能

//假设类名为A

// 实例化类

A  p = new A();

// 获取class

Class c = pgetClass();

// 获取该类所有的字段

Field[] fields = cgetDeclaredFields();

// 遍历赋值

for (int i = 0; i < fieldslength; i++) {

String filedName = fields[i]getName();

// AccessibleTest类中的成员变量为private,故必须进行此 *** 作

fields[i]setAccessible(true);

// 判断类型

Class<> type=fields[i]getType();

//获取字段类型

String typeName=typegetName();

Systemoutprintln(typegetName());

// 对字段进行赋值 第一个参数为对象引用第二个参数为要附的值

//如果为字符串类型

if("javalangString"equals(typeName)){

fields[i]set(p, "1");

}

//如果为日期类型

else if("javautilDate"equals(typeName)){

fields[i]set(p, new Date());

}

else{

fields[i]set(p, 1);

}

}

//楼主我只是简单的写了下。可能还需要判断字段名称以及其他类型什么的。

最后希望楼主多看看java 文档。

以上就是关于Java通过反射可以设置私有变量的好处有哪全部的内容,包括:Java通过反射可以设置私有变量的好处有哪、C# 如何通过反射改变私有属性的值、java 反射 访问父类私有成员等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9316202.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存