引自:http://yy629.iteye.com/blog/681430
动态代理,可以对接口、类进行代理,其中jdk自带的动态代理,只能通过接口代理,其他如:asm、cglib、javaassist对两者均可代理,其中保存jdk动态类方法:
package demo;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties;
/**
* @author yeyong
*/
public class ProxyTest2 {
public static void main(String[] args) throws Exception {
// 添加以下的几段代码, 就可以将代理生成的字节码保存起来了
Field field = System.class.getDeclaredField("props");
field.setAccessible(true);
Properties props = (Properties) field.get(null);
props.put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
Package pkg = ProxyTest2.class.getPackage();
if (pkg != null) {
String packagePath = pkg.getName().replace(".", File.pathSeparator);
new File(packagePath).mkdirs();
}
IA a = new IAImpl();
InvocationHandlerImpl ih = new InvocationHandlerImpl(a);
IA proxyA = (IA) Proxy.newProxyInstance(a.getClass().getClassLoader(),
a.getClass().getInterfaces(), ih);
proxyA.a();
}
}
interface IA {
void a();
int b(String str);
}
class IAImpl implements IA {
@Override
public void a() {
System.out.println("IAImpl.a()");
}
@Override
public int b(String str) {
System.out.println("IAImpl.b()");
return 0;
}
}
class InvocationHandlerImpl implements InvocationHandler {
private Object target;
public InvocationHandlerImpl(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before...");
Object res = method.invoke(target, args);
System.out.println("after...");
return res;
}
}
反编译后源码如下
package demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
public final class $Proxy0 extends Proxy implements IA {
private static Method m1;
private static Method m4;
private static Method m3;
private static Method m0;
private static Method m2;
public $Proxy0(InvocationHandler paramInvocationHandler) {
super(paramInvocationHandler);
}
public final boolean equals(Object paramObject) {
try {
return ((Boolean) this.h.invoke(this, m1,
new Object[] { paramObject })).booleanValue();
} catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
} catch (Throwable localThrowable) {
throw new UndeclaredThrowableException(localThrowable);
}
}
public final int b(String paramString) {
try {
return ((Integer) this.h.invoke(this, m4,
new Object[] { paramString })).intValue();
} catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
} catch (Throwable localThrowable) {
throw new UndeclaredThrowableException(localThrowable);
}
}
public final void a() {
try {
this.h.invoke(this, m3, null);
return;
} catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
} catch (Throwable localThrowable) {
throw new UndeclaredThrowableException(localThrowable);
}
}
public final int hashCode() {
try {
return ((Integer) this.h.invoke(this, m0, null)).intValue();
} catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
} catch (Throwable localThrowable) {
throw new UndeclaredThrowableException(localThrowable);
}
}
public final String toString() {
try {
return (String) this.h.invoke(this, m2, null);
} catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
} catch (Throwable localThrowable) {
throw new UndeclaredThrowableException(localThrowable);
}
}
static {
try {
m1 = Class.forName("java.lang.Object").getMethod("equals",
new Class[] { Class.forName("java.lang.Object") });
m4 = Class.forName("demo.IA").getMethod("b",
new Class[] { Class.forName("java.lang.String") });
m3 = Class.forName("demo.IA").getMethod("a", new Class[0]);
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
} catch (NoSuchMethodException localNoSuchMethodException) {
throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
} catch (ClassNotFoundException localClassNotFoundException) {
throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
}
}
}
分享到:
相关推荐
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
动态代理-jdk、cglib、javassist
JDK动态代理,关于jdk动态代理的问题!详细的说明!JDK动态代理JDK动态代理
- JDK 动态代理 - CGLIB 动态代理 - Javassist 代理 - ASM 代理 这篇文章我们来聊一下 Java 中的动态代理。 动态代理在 Java 中有着广泛的应用,比如 AOP 的实现原理、RPC远程调用、Java 注解对象获取、日志...
spring-demo16-JDK动态代理.zip
Spring Aop的底层实现技术 --- Jdk动态代理原理 很不错的一篇文章
实现了一份jdk动态代理的demo,做了详细注释,供以后复习使用,另外,这里为什么需要大于100个字节才能传资源?我就不想那么多不行吗???
动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...
Spring-AOP-利用java中的动态代理和Spring的拦截器做到AOP
java动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdf
java代理机制 JDK动态代理和cglib代理 详解
jdk 的动态代理和CGLIB代理
对jdk中的动态代理执行过程进行了详细跟踪,并反编译了动态代理调用自动生成的代理类,并对其进行了详细讲解。
- 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
JDK动态代理源码下载,动态产生代理,实现对【不同类】,【不同方法】的代理
NULL 博文链接:https://364232252.iteye.com/blog/2371503
java jdk 动态代理 演示demo