- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章实例讲解Java中动态代理和反射机制由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
反射机制 。
java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法、属性和构造方法等.
动态代理:分为jdk动态代理、cglib动态代理(spring中的动态代理).
静态代理 。
预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理 。
动态代理 。
代理类在程序运行时创建的代理方式。也就是说,代理类并不是在java代码中定义的,而是在运行期间根据我们在java代码中的“指示”动态生成的.
动态代理比静态代理的优势在于:
动态代理可以很方便的对代理类的函数进行统一的处理(invoke),而不是修改每个代理类的函数,更灵活和扩展.
jdk的动态代理(依赖于接口) 。
在java的动态代理机制中,有两个重要的类或接口,一个是invocationhandler接口,另一个是proxy类.
invocationhandler接口是给动态代理类实现的,负责处理被代理对象的操作 。
proxy类是用来创建动态代理类实例对象的,只有得到这个对象,才能调用需要代理的方法.
动态代理的代理类是在静态代理类上进行修改,将动态代理类实现invocationhandler接口,java电子书重写invoke方法,invoke方法通过传入的被代理类方法和参数来执行.
如下实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public
interface
appservice {
void
createapp(string name);
void
deleteapp(string name);
}
//代理类(比如微商代理)
public
class
appserviceimpl
implements
appservice{
@override
public
void
createapp(string name) {
system.out.print(
"app["
+name+
"] has been created."
);
}
@override
public
void
deleteapp(string name) {
system.out.print(
"app["
+name+
"] has been delete."
);
}
}
import
java.lang.reflect.invocationhandler;
import
java.lang.reflect.method;
public
class
loggerinterceptor
implements
invocationhandler {
private
object target;
//委托类(被代理类)的实例,比如厂家
public
loggerinterceptor(object target){
this
.target = target;
}
@override
public
object invoke(object proxy, method method, object[] args)
throws
throwable {
system.out.println(
"entered "
+target.getclass().getname()+
"-"
+method.getname()+
",with arguments{"
+args[
0
]+
"}"
);
object result = method.invoke(target, args);
//调用目标对象的方法 (调用厂家的方法(createapp)及参数(kevin test))
system.out.println(
"before return:"
+result);
return
result;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import
java.lang.reflect.proxy;
public
class
test {
public
static
void
main(string[] args) {
appservice target =
new
appserviceimpl();
//生成目标对象 (代理类的对象)
//接下来创建代理对象
appservice proxy = (appservice) proxy.newproxyinstance(
target.getclass().getclassloader(),
target.getclass().getinterfaces(),
new
loggerinterceptor(target));
proxy.createapp(
"kevin test1"
);
proxy.deleteapp(
"kevin test2"
);
}
}
/**
* 1、jdk的动态代理实现方式是依赖于接口的,首先使用接口来定义好操作规范。
* 2、通过proxy类产生的代理对象调用被代理对象的操作。
* 3、而这个操作又被分发给invocationhandler接口的invoke方法具体执行
*
* 在java的动态代理机制中,有两个重要的类或接口,一个是invocationhandler接口、另一个则是 proxy类,这个类和接口是实现我们动态代理所必须用到的。
invocationhandler接口是给动态代理类实现的,负责处理被代理对象的操作的,而proxy是用来创建动态代理类实例对象的,因为只有得到了这个对象我们才能调用那些需要代理的方法。
*
* 此方法的参数含义如下
proxy:代表动态代理对象
method:代表正在执行的方法
args:代表当前执行方法传入的实参
返回值:表示当前执行方法的返回值
*
* 如上:
* 使用了proxy类的newproxyinstance方法生成代理对象,然后用这个对象去调用createapp()和deleteapp()方法,
* 其实系统会将这2个方法分发给invoke()方法区执行。其中proxy对象的类是系统帮我们动态创建了,其实实现了我们的业务接口appservice
*
*/
|
cglib动态代理(继承方式) 。
cglib动态代理中使用methodinterceptor来实现动态代理类.
拦截器methodinterceptor中就是由methodproxy的invoksuper方法调用代理方法的.
methodproxy类生成代理方法和代理方法的签名.
jdk动态代理和cglib动态代理的区别:
1、jdk动态代理是实现了被代理对象的接口,cglib是继承了被代理对象.
2、cglib因为是继承机制,所以无法代理被final修饰的方法.
3、jdk和cglib都是在运行期间生产字节码,jdk是直接写class字节码,cglib使用asm框架写class字节码;cglib代理实现更复杂,生成代理类比jdk效率低.
4、jdk调用代理方法,是通过反射实现机制调用,cglib是通过fashclass机制直接调用方法,效率更高.
fastcalss机制:
为代理类和被代理类个生成一个class,这个class会为代理类或被代理类的方法分配一个index.
这个index当做一个入参,fashclass就可以直接定位要调用的方法,并直接进行调用。这样省去了反射调用,所以效率高.
最后此篇关于实例讲解Java中动态代理和反射机制的文章就讲到这里了,如果你想了解更多关于实例讲解Java中动态代理和反射机制的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在 JavaScript 中,我们可以动态创建 元素并附加到 部分,以便为大量元素应用 CSS 规则。 这种方法的优点或缺点是什么? 如果它确实提供了与元素上的 javascript 迭代相比的性
我有这个代码 import "./HTTPMethod.dart"; import '../../DataModel/DataModel.dart'; mixin RouterMixin { HT
哪些 OLAP 工具支持动态、动态地创建维度或层次结构? 例如,层次结构将成员定义为:“前 5 名”、“前 6-10 名”、“其他”... 计算成员是通常的答案,我正在寻找不同的东西。计算器的问题。成
我正在 CakePHP 中创建一个“表单编辑器”。 该界面允许用户选择要应用于字段的验证,例如数字、电子邮件等 因此,我需要根据用户输入为模型动态创建验证。为此,我可以使用验证对象:https://b
这是一个场景: 我有一个Web服务,我们将其称为部署在tomcat(轴)上的StockQuoteService。通过此 Web 服务公开了 getStockQuote() 方法。 现在,我想构建一个
我正在尝试从服务器获取 JSON 响应并将其输出到控制台。 Future login() async { var response = await http.get( Uri.
我从另一个问题中得到了这段代码(感谢 chunhunghan)。我需要创建一个登录屏幕,并尝试根据服务器发回给我的响应来验证用户凭据,但是每次我尝试运行代码时,它都会给我“未处理的异常:Interna
当我在“Dart”主程序中运行它时,一切正常,并且我得到了一个与会者列表。但是,当我在我的 Flutter 应用程序中调用它时,出现错误: flutter:“List”类型不是“List>”类型的子类
本文实例为大家分享了js实现验证码动态干扰的具体代码,供大家参考,具体内容如下 效果一 效果二 代码一 ?
目前我正在为我的网站使用 No-Ip,我想使用 cloudflare 来抵御 ddos 和机器人程序。我注意到您需要一个用于 cloudflare 的域。我还搜索了网络,发现了一个叫做 cloud
有没有办法在 Excel VBA 中构建动态 if 语句?基本上我正在尝试创建一个参数化计算,用户将能够输入不同的变量,即 变量 1 “变量 2” “变量 3” 在这种情况下 变量 1 是单元格引用
大家好, 请查看上面的图片,我有两张 table 。在下面代码的第一个表中,我得到了这种格式。 但我想像 Table2 那样格式化,每个合并单元格中的行数是动态的,而且不一样。 有没有办法像table
如何根据我添加的 View 修改标题部分的高度?heightForHeaderInSection在 viewForHeaderInSection 之前被调用我不知道 View 大小,直到我创建它。 最
是否存在在运行时生成 AST/解析树的解析器?有点像一个库,它会接受一串 EBNF 语法或类似的东西并吐出数据结构? 我知道 antlr、jlex 和他们的同类。他们生成可以做到这一点的源代码。 (喜
我在持有汽车制造商的表格上有一个 MultipleChoiceField。我想将我的汽车数据库过滤到已检查的品牌,但这会导致问题。如何动态获取所有 Q(make=...) 语句? 我如何开始:['va
$end = preg_replace($pattern, $replacement, $str); 如何使替换字符串 $replacement 随 $str 中的每次匹配而变化?例如,我想用关联的图
我正在编写一个 VBA 程序,用于过滤表中的值。我试图使其成为一个适用于您提供的所有表格的通用程序。在我的程序中,我必须设置它正在过滤的表的范围:Set rng = dataSheet.Range("
我正在循环一个元素数组,并且我想使用给定的模板递归地显示该元素 然后在该模板内使用带有切换功能的按钮来显示/隐藏给定元素的Child的更深级别模板(Child也是一个元素) 这是我的模板
从客户端(html)发送表单,服务器端通过选择选项之一决定运行哪个函数。 const decideWho = (form) => { const choice = form.choice; c
我有一个具有以下属性的按钮: circle_normal.xml(在 res/drawable 中) circle.xml(在 res/drawable 中)
我是一名优秀的程序员,十分优秀!