【问题解答】java中的私有部分能被外界访问吗?

在java 的学习过程中,我们一直认为被 private 修饰的属性是私有的,不能被外部访问的属性,这种说法也不是说是错的。常规上来说是对的,但凡事都会有个例外,java中提供的反射技术可以支持私有属性被外部访问。Java反射是Java被视为动态语言的一个关键性质。这个机制允许程序在运行时h获取任何一个已知名称的class的内部信息。Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。说白了,java的反射技术是用来加载类和解剖出类的各个组成部分。下面就演示一下它的基本使用方法。


先创建一个类里面含有各种构造方法,我们将逐个实验;
这里写图片描述
我们已经创建好了一个Test类,然后就需要新创建一个类来尝试反射技术。首先我们需要用
Class classes = Class.forName();
来获取要解剖类的完整文件名称,完整格式是“包名.类名”这里主要要去掉.java后缀,还有向上抛出异常。

下面就需要用getConstructor()方法来获取你要调用的构造方法,如果是无参构造方法,括号就就填null;
Constructor = classes.getConstructor(null);

最后用newInstance()方法来创建一个对象;
Test test = (Test) c.newInstance();

运行程序后得到结果,成功显示创建了一个新对象调用了无参构造方法

这里写图片描述


尝试调用有参构造方法:
一、 与调用无参构造方法有两处不同点,在获取构造方法时,括号中的null应该改成【class.参数类型】;在创建新对象的时候要传入参数。
这里写图片描述
二、 调用有两个参数的构造方法,只需要在第一种方式的后面多加一个参数即可。
这里写图片描述


访问私有构造方法:

我们同样使用上面的方法,改变传入参数的类型,会发现程序报错了,原因是因为此构造方法为私有属性,不能被外部访问。
这里写图片描述
这是我们需要改动两个地方。
将之前的获取构造方法代码进行改变:

Constructor = classes.getConstructor(List.class);

改为访问私有属性的方法:

Constructor c = classes.getDeclaredConstructor(List.class);

在后面再使用暴力拆解的方法。(setAccessible()方法是将任何权限的访问权限都变成打开状态)

c.setAccessible(true);

注意:第17行在上一张图片中的ArrayList()出现了报错,原因是类型转换异常,将其换成List()就可以了)

成功在一个类中访问了另一个来类的私有属性:
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigCabbageFy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值