1.接口定义
package com.henry.service;
public interface HelloService {
void sayHello();
int sum(int i ,int j);
}
2.接口实现
package com.henry.service.impl;
import com.henry.service.HelloService;
public class HelloServiceImpl implements HelloService {
public void sayHello() {
System.out.println("hello henry");
}
public int sum(int i, int j) {
// TODO Auto-generated method stub
return i+j;
}
}
3.代理类
package com.henry.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyProxy implements InvocationHandler {
private Object originalObj;
public Object bind(Object originalObj){
this.originalObj=originalObj;
return Proxy.newProxyInstance(this.originalObj.getClass().getClassLoader(), this.originalObj.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("proxy class exec");
return method.invoke(this.originalObj, args);
}
}
4.测试
package com.henry.proxy;
import com.henry.service.HelloService;
import com.henry.service.impl.HelloServiceImpl;
public class TestProxy {
public static void main(String[] args) {
HelloService service = (HelloService) new MyProxy().bind(new HelloServiceImpl());
service.sayHello();
}
}
5.结果
proxy class exec
hello henry
6.本地生成代理类文件
package com.henry.proxy;
import com.henry.service.HelloService;
import com.henry.service.impl.HelloServiceImpl;
public class TestProxy {
public static void main(String[] args) {
//生成代理类$Proxy0.class
System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
HelloService service = (HelloService) new MyProxy().bind(new HelloServiceImpl());
service.sayHello();
}
}
7.反编译$Proxy0.class
import com.henry.service.HelloService;
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 HelloService
{
private static Method m3;
private static Method m1;
private static Method m0;
private static Method m4;
private static Method m2;
public $Proxy0(InvocationHandler paramInvocationHandler)
throws
{
super(paramInvocationHandler);
}
public final void sayHello()
throws
{
try
{
this.h.invoke(this, m3, null);
return;
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
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 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);
}
}
public final int sum(int paramInt1, int paramInt2)
throws
{
try
{
return ((Integer)this.h.invoke(this, m4, new Object[] { Integer.valueOf(paramInt1), Integer.valueOf(paramInt2) })).intValue();
}
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);
}
}
static
{
try
{
m3 = Class.forName("com.henry.service.HelloService").getMethod("sayHello", new Class[0]);
m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
m4 = Class.forName("com.henry.service.HelloService").getMethod("sum", new Class[] { Integer.TYPE, Integer.TYPE });
m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
return;
}
catch (NoSuchMethodException localNoSuchMethodException)
{
throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
}
catch (ClassNotFoundException localClassNotFoundException)
{
throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
}
}
}