- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java动态代理和反射机制详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
反射机制 。
java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法、属性和构造方法等.
动态代理:分为jdk动态代理、cglib动态代理(spring中的动态代理).
静态代理 。
预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理 。
动态代理 。
代理类在程序运行时创建的代理方式。也就是说,代理类并不是在java代码中定义的,而是在运行期间根据我们在java代码中的“指示”动态生成的.
动态代理比静态代理的优势在于:
动态代理可以很方便的对代理类的函数进行统一的处理(invoke),而不是修改每个代理类的函数,更灵活和扩展.
jdk的动态代理(依赖于接口) 。
如下实例:
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
37
38
|
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
34
35
|
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动态代理的区别:
fastcalss机制:
为代理类和被代理类个生成一个class,这个class会为代理类或被代理类的方法分配一个index.
这个index当做一个入参,fashclass就可以直接定位要调用的方法,并直接进行调用。这样省去了反射调用,所以效率高.
以上所述是小编给大家介绍的java动态代理和反射机制详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:https://www.cnblogs.com/MoreThinking/p/10310251.html 。
最后此篇关于Java动态代理和反射机制详解的文章就讲到这里了,如果你想了解更多关于Java动态代理和反射机制详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
一、反射 1.定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(即使是私有的);对于任意一个对象,都能够调用它的任意方法和属性,那么,我
有没有办法从 JavaScript 对象内部获取所有方法(私有(private)、特权或公共(public))?这是示例对象: var Test = function() { // private m
我有一个抽象类“A”,类“B”和“C”扩展了 A。我想在运行时根据某些变量创建这些实例。如下所示: public abstract class A { public abstract int
假设我们在内存中有很多对象。每个都有一个不同的ID。如何迭代内存以找到与某些 id 进行比较的特定对象?为了通过 getattr 获取并使用它? 最佳答案 您应该维护这些对象的集合,因为它们是在类属性
假设我有这个结构和一个方法: package main import ( "fmt" "reflect" ) type MyStruct struct { } func (a *MyS
C#反射简介 反射(Reflection)是C#语言中一种非常有用的机制,它可以在运行时动态获取对象的类型信息并且进行相应的操作。 反射是一种在.NET Framework中广
概述 反射(Reflection)机制是指在运行时动态地获取类的信息以及操作类的成员(字段、方法、构造函数等)的能力。通过反射,我们可以在编译时期未知具体类型的情况下,通过运行时的动态
先来看一段魔法吧 public class Test { private static void changeStrValue(String str, char[] value) {
结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型
反射 1. 反射的定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们
反射的定义 java的反射(reflection) 机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到嘛,那么,我们就可以
我有一个 Java POJO: public class Event { private String id; private String name; private Lon
我编写了以下函数来检查给定的单例类是否实现了特征。 /** Given a singleton class, returns singleton object if cls implements T.
我正在研究 Java 反射的基础知识并观察有关类方法的信息。我需要获得一个符合 getMethod() 函数描述的规范的方法。然而,当我这样做时,我得到了一个 NoSuchMethodExceptio
我正在通过以下代码检索 IEnumerable 属性列表: BindingFlags bindingFlag = BindingFlags.Instance | BindingFlags.Public
我需要检查属性是否在其伙伴类中定义了特定属性: [MetadataType(typeof(Metadata))] public sealed partial class Address { p
我正在尝试使用 Reflections(由 org.reflections 提供)来处理一些繁重的工作,因此我不需要在很长的时间内为每个类手动创建一个实例列表。但是,Reflections 并未按照我
scala 反射 API (2.10) 是否提供更简单的方法来搜索加载的类并将列表过滤到实现定义特征的特定类? IE; trait Widget { def turn(): Int } class
我想在运行时使用反射来查找具有给定注释的所有类,但是我不知道如何在 Scala 中这样做。然后我想获取注释的值并动态实例化每个映射到关联注释值的带注释类的实例。 这是我想要做的: package pr
这超出了我的头脑,有人可以更好地向我解释吗? http://mathworld.wolfram.com/Reflection.html 我正在制作一个 2d 突破格斗游戏,所以我需要球能够在它击中墙壁
我是一名优秀的程序员,十分优秀!