• 200金粒签到奖励和周年纪念勋章(4/5/6/7周年)销售将于 4月13日晚结束,不要错过噢!【点我去看看】

教程 Jvav基础教程,反射(仅基础)

zw35426

【Lv:3】

VIP
开发者
正式会员
注册
2024/08/20
消息
169
金粒
1,940金粒
众所周知,jvav中有4种访问等级,分别是:
private:仅能在类内访问
不声明:仅能在包内访问
public:最开放
protected:在包外不能直接访问,但可以通过继承这个类来访问
假设这是一个Ngm类,它声明了一个私有的int值,叫你干嘛哈哈有(危险动作,请勿模仿):
public class Ngm{
private int 你干嘛哈哈有;
}
我们不能修改它的值或者获取它的值(在另一个类),除非它内部有一个公共方法返回这个值
那么,我们怎么访问/修改它呢?
VIP内容
我们可以通过类中的class方法来获得这个类:
//请勿模仿,规范命名从我做起
Class<?> 哎呦 = Ngm.class;
当然直接用类的类型也行
然后,重点来了,众所周知,一个类/方法/变量必须有一个标识符(相对于名称),记住这个名称(记不住的复制粘贴)
在这个类中用Field类型创建一个变量,变量的值是类的标识符
Field 鸡你太美 = 哎呦.getDeclaredField("你干嘛哈哈有");
这样,我们就获得了他的变量()
电脑卡了,待会更新
好了,继续!
接下来我们需要获取值,通过鸡你太美的get()方法,里面填哎呦(相对于类?),这样,我们就获得了值,不过有些彦祖就会发现,啊?为什么编译不成功?这是因为它可能会抛出两个ReflectiveOperationException类型的NoSuchFieldException异常(还一个,不想打),这个异常必须处理,或者声明这个方法可能抛出异常(就是在方法后面用throw字段加上),在加上之后,执行时,会执行失败,为什么呢?虽然可以在main方法声明异常,但这样调用它的方法(外部)不会声明,所以会失败,那怎么办?
非常简单,做个错误处理,用try字段包裹代码段
try{
Class<?> 哎呦 = Ngm.class;
Field 鸡你太美 = 哎呦.getDeclaredField("你干嘛哈哈有");
int a = 鸡你太美.get("哎呦");
}catch (NoSuchFieldException e){

}catch (IllegalAccessException e){

}
但这样仍然无法运行,这是因为原则上不能访问私有字段,所以我们还得加上鸡你太美.setAccessible(true);方法来让它运行访问私有字段
最后加上System.out.println(a);来输出
会输出0,因为int值的默认值为0
并且println方法不需要用String.valueOf方法来转换为字符串,因为它有了(未实践)
设置方法则是调用鸡你太美的set方法(一般用set就行),然后输入获取的类(第一个参数)和值(第二个参数),如果目标值已被显试赋值且是final字段声明,那则无法赋值(作者刚开始输入值为10000发现失败了研究了半天发现抛出的异常是类型转换相关的异常,后来发现值是string)
 
内容版权许可
CC BY-NC-SA 署名-非商业性使用-相同方式共享
最后编辑:

在线管理成员

在线会员

  • WinstonrOk
  • 乱杖先生
  • qifang
  • 墨绒
  • 破空
  • 肉嘎嘎biubiu
  • PuddingKC
  • qwertfxzcvb
  • Tian_Dog
  • BrAeRd
  • 出众年华
  • xiaoxing365
  • KaiK9
  • L导爱你
  • yanxi7584
  • kyg985354050
  • yanziyu
  • Angel_XQ
  • ye1115660
  • 万千少女的梦
  • polang
  • M397749490
...和 35 更多。
后退
顶部 底部