原生动态代理我们先来了解
InvocationHandler接口
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
在这个接口中只有这一个方法,当我们需要写一个代理类的时候实现它即可
下面是我写的代理类
package com.prosay.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class StudentAop implements InvocationHandler{
private Object object;
//传入的类
public StudentAop(Object object) {
this.object = object;
}
private StudentAop() {
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.print("是可爱的小姐姐?");
//调用具体方法
Object object = method.invoke(this.object, args);
System.out.print(",还是可爱的小哥哥?");
return object;
}
//创建代理类 --> 只能使用接口接收
public Object getProxyInstance(){
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
}
}
这个是测试类
package com.prosay.aop;
public class Test {
public static void main(String[] args) {
StudentAop sa = new StudentAop(new Student());
//获得代理对象 --> 使用接口接收
StudentImpl si = (StudentImpl) sa.getProxyInstance();
si.my();
}
}
想到了下为什么只能用接口接收
//创建代理类 --> 只能使用接口接收
public Object getProxyInstance(){
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
}
看了这行代码点了Proxy进去也没有什么头绪,就看到一个InvocationHandler接口
并不知道它怎么实现的,
找到可以将poxy类打出来的方法
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
打印出来的位置
使用我们的反编译器
jd-gui
下面我们来看看我们poxy0中的内容吧
package com.sun.proxy;
import com.prosay.aop.StudentImpl;
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 StudentImpl
{
private static Method m1;
private static Method m2;
private static Method m3;
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 (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
public final String toString()
throws
{
try
{
return (String)this.h.invoke(this, m2, null);
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
//这就是自己的方法 my()
public final void my()
throws
{
try
{
//这个h就是poxy中的 InvocationHandler
this.h.invoke(this, m3, null);
return;
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
public final int hashCode()
throws
{
try
{
return ((Integer)this.h.invoke(this, m0, null)).intValue();
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
static
{
try
{
m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
m3 = Class.forName("com.prosay.aop.StudentImpl").getMethod("my", 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());
}
}
}