原理和应用场景和静态代理类似
限制条件: 想要修改的那个类还是要实现接口
和静态代理的区别:不用每个类都去创建一个代理类,动态代理只是需要将实现类作为参数传到动态代理实现的那个类中去就ok了
代码实现:
- 接口:
package com.lilei.test.proxytest;
/**
* Created by Administrator on 2017/9/26.
*/
public interface Hello {
void say(String name);
void eat(String name);
}
- 接口实现类
package com.lilei.test.proxytest;
/**
* Created by Administrator on 2017/9/26.
*/
public class HelloImp1 {
public void say(String name) {
System.out.println("Hello! "+name);
}
public void eat(String name) {
System.out.println("eat "+name);
}
}
3.动态代理实现类
package com.lilei.test.proxytest;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 动态代理对象
* Created by Administrator on 2017/9/27.
*/
public class DynamicProxy implements InvocationHandler{
private Object target;
public DynamicProxy(Object target){
this.target = target;
}
/**
* @param proxy 指代我们所代理的那个真实对象
* @param method 指代的是我们所要调用真实对象的某个方法的Method对象
* @param args 指代的是调用真实对象某个方法时接受的参数
* @return
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target,args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
public <T> T getProxy(){
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
}
- 动态代理测试类
package com.lilei.test.proxytest;
import java.lang.reflect.Proxy;
/**
* java动态代理
* Created by Administrator on 2017/9/27.
*/
public class DynamicProxyTest {
public static void main(String[] args) {
Hello hello = new HelloImp();
// DynamicProxy dynamicProxy = new DynamicProxy(hello);
// Hello helloProxy = (Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(),hello.getClass().getInterfaces(),dynamicProxy);
DynamicProxy dynamicProxy = new DynamicProxy(hello);
Hello helloProxy = dynamicProxy.getProxy();
helloProxy.say("lilei");
helloProxy.eat("lilei");
}
}