动态代理

package Agency;

public interface ITest {
void test1();
void test2();
}
package Agency;

public class TestDemoIMpl implements ITest{
@Override
public void test1() {
System.out.println(“执行test1”);
}

@Override
public void test2() {
    System.out.println("执行test2");

}

}
package Agency;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxDemo implements InvocationHandler {
/**
*动态代理类
*/
Object obj;//被代理的对象
public ProxDemo(Object obj){
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName()+“开始执行”);
Object result=method.invoke(this.obj,args);//执行的是指定代理对象的指定的方法
System.out.println(method.getName()+“执行完毕”);
return result;
}
}

package Agency;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {
public static void main(String[] args) {
TestDemoIMpl test = new TestDemoIMpl();
/**
注意:如果一个对象想要通过Proxy.newProxyInstance方法被代理,
* 那么这个对象的类一定要有相应的接口
* 就行本类中的TestDemoIMpl实现类和 ITest接口
/
test.test1();
test.test2();
System.out.println("-------------------------------------------------");
/
需求:
在执行test1和test2方法时需要加入一些东西
在执行方法前打印test1或test2开始执行
在执行方法后打印test1或test2执行完毕
打印的方法名要和当时调用方法保存一致
*
*/
InvocationHandler handler = new ProxDemo(test);
/**handler.getClass().getClassLoader()
*参数1是代理对象的类加载器
*参数2是被代理的对象的接口
* 参数3是代理对象
* 返回的值就成功被代理后对象 返回的是object类型,需要根据当时的情况去转换类型
* 将接口传递给代理
*/
ITest t= (ITest) Proxy.newProxyInstance(handler.getClass().getClassLoader(),test.getClass().getInterfaces(),handler);
t.test1();
t.test2();

}

}

上一篇:假期学习【一】Ubuntu中Linux的基础操作


下一篇:微信统一下单官方文档解释