1.接口
public interface World {
public void sayHello(int age);
}
2.实现接口
public class HelloWorld implements World {
public void sayHello(int age) {
System.out.println(age);
}
}
3.实现InvocationHandler
public class ProxyHandler implements InvocationHandler {
private Object object ;
public Object bind(Object object) {
this.object = object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start log");
Object object = method.invoke(this.object, args);
System.out.println("end log");
return object;
}
}
4.主函数
public class ProxyMain {
public static void main(String[] args) {
//保存代理对象字节码文件
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
World world = (World) new ProxyHandler().bind(new HelloWorld());
world.sayHello(12);
}
}
5.然后反编译代理.class文件
“`
package com.sun.proxy;
import com.haut.proxy.World;
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 World
{
private static Method m1;
private static Method m3;
private static Method m2;
private static Method m0;
public $Proxy0(InvocationHandler paramInvocationHandler)
throws
{
super(paramInvocationHandler);
}
public final boolean equals(Object paramObject)
throws
{
try
{
return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();
}
catch (RuntimeException localRuntimeException)
{
throw localRuntimeException;
}
catch (Throwable localThrowable)
{
}
throw new UndeclaredThrowableException(localThrowable);
}
//thid.h指是就是ProxyHandler
public final void sayHello(int paramInt)
throws
{
try
{
//看到这里就应该明白了吧
this.h.invoke(this, m3, new Object[] { Integer.valueOf(paramInt) });
return;
}
catch (RuntimeException localRuntimeException)
{
throw localRuntimeException;
}
catch (Throwable localThrowable)
{
}
throw new UndeclaredThrowableException(localThrowable);
}
public final String toString()
throws
{
try
{
return (String)this.h.invoke(this, m2, null);
}
catch (RuntimeException localRuntimeException)
{
throw localRuntimeException;
}
catch (Throwable localThrowable)
{
}
throw new UndeclaredThrowableException(localThrowable);
}
public final int hashCode()
throws
{
try
{
return ((Integer)this.h.invoke(this, m0, null)).intValue();
}
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”) });
//得到方法
m3 = Class.forName(“com.haut.proxy.World”).getMethod(“sayHello”, new Class[] { Integer.TYPE });
m2 = Class.forName(“java.lang.Object”).getMethod(“toString”, new Class[0]);
m0 = Class.forName(“java.lang.Object”).getMethod(“hashCode”, new Class[0]);
return;
}
catch (NoSuchMethodException localNoSuchMethodException)
{
throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
}
catch (ClassNotFoundException localClassNotFoundException)
{
}
throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
}
}
6 流程分析
7 动态代理的优点
和静态代理相比,减少大量的冗余代码,静态代理每一个接口生成一个代表类,
spring aop的面向切面编程,典型的日志功能,每个接口都用代理类去代理,这样在不改变原有逻辑的基础上,给接口赋予了其它能力,代码简洁