使用反射机制调用属性和私有成员与代理模式的介绍

简介:

使用反射机制调用属性:

通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值、得值操作,调用getField方法并传递属性的名称可以获得指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性:

代码示例:

e7af3dfa6ad0eccaae4e5d2c593ff557.png


Student类示例:

59a87a4863b38f42fc980e2adb78c587.png


运行结果:

f7de6ca707b43e045021db7724960087.png

从运行结果可以看出只拿出了公开的属性,私有的属性拿不到。

 

 

使用反射机制调用私有成员:

1.调用私有属性

在反射机制里调用私有属性需要通过getDeclaredFields方法或者getDeclaredField方法,前者是获得类里所有的私有属性,后者是获得指定的私有属性,类似于getFieldsgetField但是使用getDeclaredFields或者getDeclaredField方法获得私有属性之后需要再调用setAccessible方法进行一个调用授权的操作才能对获得到的私有属性进行操作:

代码示例:

a3348e0b5cbe5d3dba709beafb79ff57.png


Student代码示例:

b148513248ba1955131f91a6de9d5c4f.png


运行结果:

e7316fb3a16a38ca4be61ad270f165a3.png



2.调用私有方法

调用私有方法也是一样的,需要先通过getDeclaredMethods方法或者getDeclaredMethod方法来获得私有方法,然后还得再调用setAccessible方法进行调用授权:

代码示例:

e5526bb22747b0c3299039e2c3f18ff5.png


Student代码示例:

66df3cf3d7882119469c2ec5b8691861.png


运行结果:

99de5fe0e4db56853a75bda9f09f2008.png


3.调用私有构造器

91661b495e8780672e5df92e669f4a89.png


Student代码示例:

4b932f4d147ebf6f6d6f653ffc541a1f.png


运行结果:

d8c8bea40304b21825ddceca67e99205.png



代理模式:

代理模式又称为切面编程,顾名思义就是可以把代码切开一个缝隙塞入一些代码,代理模式可以在方法的前后监控异常,也可以把日志打印语句放在代理里,方法里就不需要写日志打印的语句了,资源的开启和关闭这种重复次数多的的代码也可以写在代理里,同样的在方法里就不需要再写了,所以代理模式类似于中介一样,在代码中间解决一些反复而常规的代码。

 编写代理模式的代码,第一步是写一个接口声明一个方法,第二步写一个A类去实现这个接口,在方法里写上一些代码,第三步写一个B类,这个类也要实现接口,并且在这个类的属性上声明接口的变量,构造器里声明接口类型的参数,用于把对象存储到属性里,接着在重写接口的方法里调用A实现类里的方法,第四步写运行类,在main方法里首先new A类的对象出来,然后new B类的对象并且把A类的对象放进B类的构造器里,最后用B类的对象调用方法。

代码示例:

b6a9922eb94b2f55d0a167892e20fa51.png

ca167b68c4c0a23d924c8c1a0e02220f.png

4081a35cf06fd91c3a71b56de2338a4f.png

061aaddd1f17324036e11f7d99a5b03d.png


运行结果:

91af8a5f86998e46f7a887c3055989c8.png


代码图解:

35125e53ade833244cb21cfb24a5deb8.png



还可以使用继承的方式编写代理模式,但是继承有个弊端,万一这个类不允许被继承(final修饰的类),或者还需要继承其他的类(Java只能单一继承),那么就无法编写代理模式,因为接口可以实现多个,所以使用接口是最好的。

代码示例:

f8537ef5d98816a66ad6472feb20e19d.png

499345e742bfda100cd891b74afa31da.png

beb91e71688ed8a6a814cdce305b641a.png


运行结果:

6235440394a4389cce44915d70a2e028.png


代码图解:

296d09cd1c38ddbe894ac1c3cc48ed7e.png



本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976632,如需转载请自行联系原作者


相关文章
|
10天前
|
存储 编译器 程序员
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)
|
1月前
|
存储 C++
C++对象和类
C++对象和类
14 0
|
1月前
|
存储 C#
C#对象和类
C#对象和类
15 0
|
2月前
|
存储 C语言 C++
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
|
4月前
|
存储 算法 Java
第 4 章 对象与类(上)
第 4 章 对象与类
63 0
|
4月前
|
存储 Java 编译器
第 4 章 对象与类(下)
第 4 章 对象与类
106 0
|
8月前
|
Java 程序员 C#
C++类成员的访问权限以及类的封装
C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。 Java、C# 程序员注意,C++ 中的 public、private、protected 只能修饰类的成员,不能修饰类,C++中的类没有共有私有之分。 在类的内部(定义类的代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。 在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 p
60 0
|
11月前
|
编译器 C语言 C++
C++ 类 & 对象
【摘要】 C++ 类 & 对象C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。C++ 类定义定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是...
|
Java
Java - 反射使用(调用私有方法、修改私有属性、获取父类私有字段)
Java - 反射使用(调用私有方法、修改私有属性、获取父类私有字段)
715 0