北海北极熊
卡布达96
首先this指代的是当前类的对象。当前类是cglibProxy,所以this指代是cglibProxy类的对象。
当前类应该容易理解当前声明的类。想了解更多继续看。
官方文档: this 称为隐式参数。
这个应用应该见过:
public class Student {
private String name;
public void setName(String n) {
name = n;
}
}
Student stu = new Student();
stu.setName("siri") 他的执行过程是这样的stu.name="siri";
stu是name的隐式参数(即调用此方法的对象) 用关键字this表示
相对应的 String n ,n 称为方法的显示参数。
隐式参数一般用写,当方法的局部变量和类的成员变量发生冲突是必须
用隐式参数如
setName(Stirng name) {
name = name;//error
this.name = name //right this 代表调用此方法的对象
}
-----------------------------------------
qq_与赠_03193390
intercept是一个拦截器,当执行该类方法时候都会被调用
qq_荻芦落沙_0
在使用中指定哪个就调用哪个,比如说例子中测试类调用了Train.move()方法,那么就是move()方法,如果Train类中还存在其他方法比如put()方法,那么则通过Train.put()调用。而proxy.invokeSuper(obj, args);中的args是指定在调用方法时可否带参数。如果proxy.invokeSuper(obj);的话。在调用方法时是不可以带参数的。
慕粉0025591159
哦,好的
qq_剑皇_0
视频下方不是有个资料下载吗
程序小白123
### 前置基础知识
- 具备面向对象设计思维
- 了解多态的概念
- **了解反射机制**
可以再看看java反射机制
慕粉4260019
m:方式 和 arg:参数,代理对象的参数
PlaceHolder
完全不一样了,
jdk动态代理是通过接口,只有接口实现了实现类,才可以用jdk进行代理:
cglib是通过类,通过拦截技术拦截父类调用的技术,在创建子类进行覆盖,
jdk和cglib是完全不一样的2个概念
niuhao
public static void main(String[] args) {
Car car = new Car();
InvocationHandler h = new JDKProxy(car);
Class<?> cls = car.getClass();
Move m = (Move) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h);
InvocationHandler h1 = new LogProxy(m);
/**
* loader:类加载器,
* interfaces:实现接口
* h:InvocationHandler
*/
Move m1 = (Move) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h1);
m1.move();
}
周君龙
反射机制
java家洼
我在其它地方(chuanzhi,打名字不让我发)中看到了,这个回调函数就是给代理类执行时需要运行这个方法intercept,那么穿本类的实例进去,之后就会回调这个方法,实现动态代理。
用户1158837
Car car = new Car();
InvocationHandler timeHandler = new TimeHandler(car);
Movable movable1 = (Movable)Proxy.newProxyInstance(car.getClass().getClassLoader(), car.getClass().getInterfaces(), timeHandler);
InvocationHandler logHandler = new LogHandler(movable1);
Movable movable2 = (Movable)Proxy.newProxyInstance(movable1.getClass().getClassLoader(), movable1.getClass().getInterfaces(), logHandler);
movable2.move();
初生牛犊zjh
嗯嗯,同问同问
DavidLee
应该是你没有导入相关的jar cglib-nodep-2.1.3.jar
用户1078541
您好,很高兴收到你的问题,解答如下:
JDK动态代理只能代理实现了接口的类,不是这个类(比如Car,实现Moveable接口)需要实现InvocationHandler,而是他的处理器(LogHandler)需要实现InvocationHandler接口。
JDK动态代理它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
用户1078541
我们看一下示例中的代码:
/**
* 拦截所有目标类方法的调用
* obj 目标类的实例
* m 目标方法的反射对象
* args 方法的参数
* proxy代理类的实例
*/
@Override
public Object intercept(Object obj, Method m, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("日志开始...");
//代理类调用父类的方法
proxy.invokeSuper(obj, args);
System.out.println("日志结束...");
return null;
}
intercept()方法拦截所有目标类方法的调用,如果调用proxy.invoke(obj, args);
会报java.lang.StackOverflowError异常,原因是将代理类作为目标类,这样会无限循环调用intercept方法,
导致无限死循环;二代理类的父类只有一个,调用父类的方法只会调用一次。
xiaodidandan