Java学习day44-java动态代理
一、Java动态代理
1.Proxy:专门完成代理的操作类,是所有动态代理类的父类。通过此类为一个或多个接口动态的生成实现类。
2.创建一个动态代理类所对应的Class对象:
static Object newProxyinstance(ClassLoader,Class<?>[] Interfaces,InvocationHandler h) 直接创建一个动态代理对象
二、实例
1.先给类创建一个接口
package day19; public interface ITestDemo { void test1(); void test2(); }
2.再创建一个类实现接口
package day19; public class TestDemoImpl implements ITestDemo { public void test1() { // TODO Auto-generated method stub System.out.println("执行test1方法"); } public void test2() { // TODO Auto-generated method stub System.out.println("执行test2方法"); } }
3.创建动态代理类
package day19; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 动态代理类 * */ public class ProxyDemo implements InvocationHandler{ Object obj;//被代理的对象 public ProxyDemo(Object obj){ this.obj = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub System.out.println(method.getName() + " 方法开始执行"); Object result = method.invoke(this.obj, args);//执行的是代理对象的指定的方法 System.out.println(method.getName() + " 方法执行结束"); return null; } }
四、测试实现动态代理
package day19; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test2 { public static void main(String[] args){ ITestDemo test = new TestDemoImpl(); /** * 注意:如果一个对象想要通过Proxy.newProxyInstance方法被代理, * 那么这个对象的类一定要有相应的接口 * 就像本类中的ITestDemo接口和实现类TestDemoImpl * */ test.test1(); test.test2(); System.out.println("=================================="); /** * 需求:在执行test1和test2方法时需加入一些东西 * 1.在执行方法前打印test1或test2开始执行 * 2.在执行方法后打印test1或test2执行完毕 * 打印的方法名要和当时调用的方法保持一致 * */ InvocationHandler handler = new ProxyDemo(test); /** * Proxy.newProxyInstance(ClassLoader(), interfaces, h) * 参数1是代理对象的类加载器 * 参数2是被代理的对象的接口 * 参数3是代理对象 * * 返回的值就是成功被代理后的对象,返回的是Object类型,需要根据当时的情况去转换类型 * */ ITestDemo t = (ITestDemo)Proxy.newProxyInstance(handler.getClass().getClassLoader(), test.getClass().getInterfaces(), handler); t.test1(); System.out.println("----------------------------------"); t.test2(); } }
打印结果:


浙公网安备 33010602011771号