实现jdk的动态代理只要实现InvocationHandler 接口即可。会在程序执行的时候动态生成一份class文件。这个Class实现了所代理类的接口的所有方法。
1:定义一个接口
/**
* Created by mapp on 2018/3/6.
*/
public interface UserService {
UserVO get(String name);
}
2:实现类
/**
* Created by mapp on 2018/3/6.
*/
public class UserServiceImp implements UserService {
@Override
public UserVO get(String name) {
UserVO user = new UserVO();
user.setUserName(name);
return user;
}
}
3:实现InvocationHandler 接口
/**
* Created by mapp on 2018/3/6.
*/
public class MyInvocationHandler implements InvocationHandler {
private Object obj;
public MyInvocationHandler(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 如果用户名是admin,则转为超级管理员
for(int i = 0; i < args.length; i++) {
if (args[i] instanceof String) {
if ("admin".equals(args[i])) {
args[i] = "超级管理员";
}
}
}
Object result = method.invoke(obj, args);
return result;
}
/**
* 获取代理对象
* @return
*/
public Object getProxyObj() {
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
}
4:测试
public static void main(String[] args) {
UserService userService = new UserServiceImp();
MyInvocationHandler handler = new MyInvocationHandler(userService);
UserService proxyService = (UserService) handler.getProxyObj();
UserVO userVO = proxyService.get("admin");
System.out.println(userVO.getUserName());
}
控制台输出:
超级管理员
Process finished with exit code 0
5:获取动态生成的代理类class文件
public static void main(String[] args) throws IOException {
UserService userService = new UserServiceImp();
MyInvocationHandler handler = new MyInvocationHandler(userService);
UserService proxyService = (UserService) handler.getProxyObj();
// 生成class文件
byte[] data = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{UserService.class});
FileOutputStream os = new FileOutputStream("D:/$Proxy0.class");
os.write(data);
os.flush();
os.close();
UserVO userVO = proxyService.get("admin");
System.out.println(userVO.getUserName());
}
6:反编译代理类class
public final class $Proxy0 extends Proxy implements UserService {
private static Method m1;
private static Method m2;
private static Method m3;
private static Method m0;
public $Proxy0(InvocationHandler var1) throws {
super(var1);
}
public final boolean equals(Object var1) throws {
try {
return ((Boolean)super.h.invoke(this, m1, new Object[]{var1})).booleanValue();
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final String toString() throws {
try {
return (String)super.h.invoke(this, m2, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final UserVO get(String var1) throws {
try {
return (UserVO)super.h.invoke(this, m3, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final int hashCode() throws {
try {
return ((Integer)super.h.invoke(this, m0, (Object[])null)).intValue();
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
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.ustcsoft.jt.UserService").getMethod("get", new Class[]{Class.forName("java.lang.String")});
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
} catch (NoSuchMethodException var2) {
throw new NoSuchMethodError(var2.getMessage());
} catch (ClassNotFoundException var3) {
throw new NoClassDefFoundError(var3.getMessage());
}
}
}