静态代理
接口
package service;
public interface UserService {
void add();
void delete();
void list();
void login();
void update();
}
实现类
package Impl;
import service.UserService;
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("add user");
}
public void delete() {
System.out.println("delete user");
}
public void list() {
System.out.println("list user");
}
@Override
public void login() {
System.out.println("login user");
}
@Override
public void update() {
System.out.println("update user");
}
}
静态代理类
package cn.juhe.proxy;
import cn.juhe.service.UserService;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
public class StaticUserServiceProxy implements UserService {
public void setTarget(UserService target) {
this.target = target;
}
private UserService target;
@Override
public void login() {
Instant start = Instant.now();
target.login();
Instant end = Instant.now();
System.out.println("StaticUserServiceProxy login cost :" + ChronoUnit.MILLIS.between(start, end));
}
@Override
public void add() {
}
@Override
public void delete() {
}
@Override
public void update() {
}
@Override
public void select() {
}
}
测试
@Test
public void service() {
UserServiceImpl userService = new UserServiceImpl();
userService.add();
userService.delete();
userService.list();
}
@Test
void staticProxy(){
UserServiceImpl userService = new UserServiceImpl();
StaticUserServiceProxy proxy = new StaticUserServiceProxy();
proxy.setTarget(userService);
proxy.login();
}
动态代理
package handler;
import service.UserService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.time.Instant;
public class MyInvocationHandler implements InvocationHandler {
public MyInvocationHandler(UserService target) {
this.target = target;
}
private UserService target;
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("当前执行的方法是:" + method.getName());
System.out.println("执行前的时间是:" + Instant.now().toString());
Thread.sleep(1000);
Object invoke = method.invoke(target, args);
System.out.println("执行结束时间是:" + Instant.now().toString());
return invoke;
}
}
测试
@Test
public void dynamicMethod() throws Exception {
UserService userService = new UserServiceImpl();
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(userService);
UserService proxyInstance = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), myInvocationHandler);
byte[] classFile = ProxyGenerator.generateProxyClass("$Proxy0", userService.getClass().getInterfaces());
FileOutputStream out = new FileOutputStream("$Proxy0.class");
out.write(classFile);
out.close();
proxyInstance.add();
proxyInstance.delete();
proxyInstance.list();
}
通过字节码反编译动态代理类
package handler;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;
public class TestGenerate {
public static void main(String[] args) throws Exception {
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("/Users/java0904/IdeaProjects/javaDynamicProxy/src/main/resources/proxy.class"));
Scanner scanner = new Scanner(new FileInputStream("/Users/java0904/IdeaProjects/javaDynamicProxy/src/main/resources/orgin.txt"));
while (scanner.hasNext()) {
scanner.next();
scanner.next();
dataOutputStream.write(scanner.nextByte());
}
scanner.close();
dataOutputStream.close();
}
}
生成的动态代理文件
package com.sun.proxy;
import cn.juhe.service.UserService;
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 UserService {
private static Method m1;
private static Method m2;
private static Method m3;
private static Method m5;
private static Method m7;
private static Method m6;
private static Method m0;
private static Method m4;
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});
} 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 void add() throws {
try {
super.h.invoke(this, m3, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void delete() throws {
try {
super.h.invoke(this, m5, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void select() throws {
try {
super.h.invoke(this, m7, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void login() throws {
try {
super.h.invoke(this, m6, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final int hashCode() throws {
try {
return (Integer)super.h.invoke(this, m0, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void update() throws {
try {
super.h.invoke(this, m4, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
static {
try {
m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
m2 = Class.forName("java.lang.Object").getMethod("toString");
m3 = Class.forName("cn.juhe.service.UserService").getMethod("add");
m5 = Class.forName("cn.juhe.service.UserService").getMethod("delete");
m7 = Class.forName("cn.juhe.service.UserService").getMethod("select");
m6 = Class.forName("cn.juhe.service.UserService").getMethod("login");
m0 = Class.forName("java.lang.Object").getMethod("hashCode");
m4 = Class.forName("cn.juhe.service.UserService").getMethod("update");
} catch (NoSuchMethodException var2) {
throw new NoSuchMethodError(var2.getMessage());
} catch (ClassNotFoundException var3) {
throw new NoClassDefFoundError(var3.getMessage());
}
}
}