动态代理。。。使用cglib 这个jar文件。。
package test.dynasic;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class TestDynasicProxy implements MethodInterceptor {
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
System.out.println("before method invoke " + method.getName());
[color=red]Object o = methodProxy.invokeSuper(proxy, args);[/color]
System.out.println("after method invoke ");
return o;
}
public static void main(String[]args){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(DynasicProxy.class);
enhancer.setCallback(new TestDynasicProxy());
DynasicProxy dp = (DynasicProxy)enhancer.create();
dp.saySomething();
}
}
class DynasicProxy{
public void saySomething(){
System.out.println("hello");
}
}
java中的反射机制实现的代理,适合实现接口的类
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestProxy {
public static void main(String[]args){
IProxy myProxy = (IProxy) Proxy.newProxyInstance(MyProxy.class.getClassLoader(), MyProxy.class.getInterfaces(), new MyProxyHandler<IProxy>(new MyProxy()));
String message = myProxy.saySomething();
System.out.println(message);
}
}
class MyProxy implements IProxy {
public String saySomething(){
System.out.println("hello");
return "ok";
}
}
class MyProxyHandler<T> implements InvocationHandler{
private T t;
public MyProxyHandler(T t){
this.t = t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object returnMessage = null;
try{
System.out.println("before method invoke "+method.getName());
[color=red]returnMessage = method.invoke(t, args);[/color]
System.out.println(returnMessage);
System.out.println("after method invoke");
} catch(Exception e){
e.printStackTrace();
}
return returnMessage;
}
}
接口:
package test;
interface IProxy {
public String saySomething();
}
无语了,红色的代码让我吃尽苦头。。。 在使用代理时,不可以在代理的实现中在使用代理来调用,不然就会不断地递归调用,知道堆栈溢出,最后崩溃。。。。
分享到:
相关推荐
JDK 动态代理是 Java 自带的动态代理机制,它只能代理接口,而不能代理类。这是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类...
- **提供间接访问:** 当客户端不能或不想直接与目标对象交互时,代理模式可以通过代理对象作为中间人来控制访问。 - **增加额外功能:** 代理模式可以在不改变原有对象的基础上为其添加新的行为或责任,如日志记录、...
CGLIB通过动态生成子类的方式实现代理,适用于不能或不方便使用接口的情况。 #### 4. JDK Proxy与CGLIB的对比 - **JDK Proxy**: - 优点:实现简单,仅需要实现接口即可。 - 缺点:只能用于接口的代理。 - **...
在Java编程中,动态代理是一种强大的技术,它允许我们在运行时创建对象的代理,这些代理对象可以在调用实际方法之前和之后执行额外的操作。这种机制主要用于实现AOP(面向切面编程)和事件监听等功能。在本文中,...
装饰模式通常用于当需要为对象添加新功能,但又不想修改原有类的结构时。在Java中,装饰模式通常通过继承实现,一个装饰类会持有原对象的引用,并在其基础上增加新的方法或增强已有方法。例如,在数据库连接池中,...
总结来说,JDK动态代理适合处理实现了接口的对象,CGLIB适用于没有接口或者对性能要求较高的情况,而javassist提供了更灵活的字节码操作,适用于更复杂的场景。理解并掌握这三种动态代理技术,对于提升Java编程的...
此外,如果目标接口增加新方法,代理类也需要相应地修改,这样的维护工作对于大型系统来说是个不小的负担。 而动态代理在运行时才确定代理关系,它带来了更大的灵活性和扩展性。动态代理的实现依赖于Java的反射机制...
Java JDK 动态代理是一种强大...如果你不想上传大于100字节的文件,可以尝试寻找不受此限制的平台或调整你的文件内容以满足要求。在实际开发中,这样的限制通常是合理的,因为小文件可能不足以承载有意义的数据或代码。
这就是动态代理在AOP中的应用,它允许我们在不修改原始代码的情况下,向方法调用前后插入额外的行为。 总结起来,Java中的动态代理是AOP的一种实现方式,它利用`InvocationHandler`接口创建一个代理类,这个代理类...
动态代理基于Java接口工作,因此需要定义一个或多个接口,这些接口代表了你想要代理的对象的行为。 #### c. 创建代理对象 使用`Proxy.newProxyInstance()`方法创建代理对象,传入代理接口的类加载器、接口列表和`...
Java动态代理是Java提供的...总结来说,Java动态代理结合注解日志拦截是一种高效且灵活的日志处理方式,它允许我们在不修改原有代码的情况下增强方法调用的前后处理,特别是对于需要统一处理的日志记录场景,非常实用。
通过上述分析和示例,我们可以看到JDK动态代理机制的强大之处在于能够在不修改原有业务逻辑的情况下,为其添加额外的行为。这对于实现诸如事务管理、日志记录等功能非常有用。同时,JDK动态代理也为我们提供了深入...
假设我们有一个遗留系统,其中有一些旧接口`OldInterface`,而我们希望使用新接口`NewInterface`,但又不想修改旧系统的代码。通过动态代理,我们可以创建一个实现了`NewInterface`的代理类,让它在内部调用`...
当无法或者不想使用Java标准的JDK动态代理(只能代理接口实现类)时,CGLib可以生成目标类的子类来实现对目标对象的代理。这个过程中,CGLib的核心类`Enhancer`起到了关键作用。`Enhancer`允许开发者指定被代理的...
然而,Java动态代理有一个限制,那就是它只能对实现了接口的类进行代理,不能对没有实现接口的类进行代理。如果你需要对类进行代理而该类没有接口,那么可能需要使用其他技术,如CGLIB。 总的来说,Java动态代理是...
总的来说,Java动态代理为我们提供了一种灵活的编程模式,让我们可以在不修改原有代码的情况下扩展或增强已有类的行为,这对于实现AOP和工具类的构建非常有用。理解和熟练使用`java.lang.reflect.Proxy`可以帮助我们...
现在许多人常用QQ(MSN/ICQ)上网聊天,但有时候在办公室或公司内部无法使用,这时你可以通过代理来实现,有很多人上网不想留下自己的真实地址,这时你可以通IP代理来实现。虽然现在网上有很我免费的IP代理,但哪个...
- 使用`Proxy.newProxyInstance()`方法,传入类加载器(通常为接口的类加载器)、接口数组(包含所有你想代理的接口)以及你的`InvocationHandler`实例。 4. **使用示例**: - 假设我们有一个`MyService`接口和一...