1,提供一个接口
public interface Person {
public String getName();
public String getSex();
public void findLove();
}
2,一个实现类
public class Zhangsan implements Person{
private String name = "张三";
private String sex = "男";
public String getName() {
return this.name;
}
public String getSex() {
return this.sex;
}
public void findLove() {
System.out.println("名字是:"+this.name+",性别是:"+this.sex);
System.out.println("1,我要寻找的对象是白富美");
System.out.println("2,我的对象要有房有车");
}
}
3,生成一个代理类
/**
* 媒婆,这是一个代理类
*
*/
public class MeiPo implements InvocationHandler {
private Person target;
/**
* 生成一个代理对象
* @return
*/
public Object getInstance(Person target) {
this.target = target;
Class<? extends Person> clz = target.getClass();
System.out.println("被代理的对象是==》"+clz);
/**原理:
* 1,代理对象是在内存中生成的
* 2,第一步要获取被代理对象的引用,然后获取它的接口
* 3,把被代理对象的引用拿到了
* 4,重新动态生成一个class字节码的目标代理对象
*/
return Proxy.newProxyInstance(clz.getClassLoader(), clz.getInterfaces(), this);
}
/**
* method 目标方法
* args 目标方法的参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是一个媒婆,我要来做媒了。。。你的名字是"+this.target.getName()+",你的性别是"+this.target.getSex());
System.out.println("======================");
// this.target.findLove();
method.invoke(this.target, args);
System.out.println("======================");
System.out.println("媒婆做媒结束。。。。");
return null;
}
public static void main(String[] args) {
Person proxy = (Person) new MeiPo().getInstance(new Zhangsan());
System.out.println("代理对象为===》"+proxy.getClass());
//一旦开始调用目标方法,代理对象的invoke 方法就会开始执行
proxy.toString();
System.out.println("==========2===============");
proxy.findLove();
}
}
4,查看生成代理类的源码
byte[] data = ProxyGenerator.generateProxyClass("$proxy0", new Class[] {Person.class});
FileOutputStream fos = new FileOutputStream("c:/test/src/main/java/$proxy.class");
fos.write(data);
System.out.println("代理对象生成完毕");
fos.close();
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // import com.zl.test.Person; 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 Person { private static Method m1; private static Method m4; private static Method m3; private static Method m5; private static Method m2; 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 getSex() throws { try { return (String)super.h.invoke(this, m4, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } public final String getName() throws { try { return (String)super.h.invoke(this, m3, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } public final void findLove() throws { try { super.h.invoke(this, m5, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } 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 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", Class.forName("java.lang.Object")); m4 = Class.forName("com.zl.test.Person").getMethod("getSex"); m3 = Class.forName("com.zl.test.Person").getMethod("getName"); m5 = Class.forName("com.zl.test.Person").getMethod("findLove"); m2 = Class.forName("java.lang.Object").getMethod("toString"); m0 = Class.forName("java.lang.Object").getMethod("hashCode"); } catch (NoSuchMethodException var2) { throw new NoSuchMethodError(var2.getMessage()); } catch (ClassNotFoundException var3) { throw new NoClassDefFoundError(var3.getMessage()); } } }