实现:
新建ITestDemo接口
package com.study.javastu3;
public interface ITestDemo {
public void test();
public void test1();
}
用ProxyDemo类实现ITestDemo接口
package com.study.javastu3;
public class TestDemoImpl implements ITestDemo{
@Override
public void test() {
System.out.println("执行test 0");
}
@Override
public void test1() {
System.out.println("执行test 1");
}
}
实现InvocationHandler的代理类 ProxyDemo
package com.study.javastu3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/*
动态代理类
*/
public class ProxyDemo implements InvocationHandler {
Object obj;//被代理的对象
public ProxyDemo(Object obj){
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName()+" 方法开始执行!");
Object obj = method.invoke(this.obj,args); //执行代理对象的指定方法
System.out.println(method.getName()+" 方法结束执行!");
return obj;
}
}
测试:
package com.study.javastu3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test2 {
public static void main(String[] args)
{
/**
* 如果一个对象想要通过Proxy.newProxyInstance()方法被代理,
* 那么这个类中的类必须要有接口
* 就像本类的TestDemoImpl有ITestDemo接口
*/
ITestDemo test = new TestDemoImpl();
test.test();
test.test1();
// 需求,在执行test1和test2方法时,需要在执行之前打印test1或者test2开始执行,
// 在执行方法后,打印test1或者test2方法结束,打印的方法名要和当时调用的方法名一致
InvocationHandler handler = new ProxyDemo(test);
// Proxy.newProxyInstance(,,)
// 有三个参数,参数1是代理对象的类加载器,参数2是被代理对象的接口,参数3是代理对象
//返回的值就是成功代理后返回的对象,返回的值是Object类型,需要根据情况进行强转
ITestDemo t = (ITestDemo) Proxy.newProxyInstance(handler.getClass().getClassLoader(),test.getClass().getInterfaces(),handler);
t.test();
t.test1();
}
}
/* 测试结果
执行test 0
执行test 1
test 方法开始执行!
执行test 0
test 方法结束执行!
test1 方法开始执行!
执行test 1
test1 方法结束执行!
*/