java 动态代理,通过反射机制构造类对象,然后实现不同类对象的方法调用
利用jdk提供的动态代理接口
接口:
package lmc.test.com.cn;
public interface Animal {
public void speak();
public void run();
}
实现:
package lmc.test.com.cn;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy {
class People implements Animal
{
public void speak()
{
System.out.println("I am a person, I can speak a word: hello.");
}
public void run()
{
System.out.println("I am a person, I can run at speed of 5km/h.");
}
}
class Dog implements Animal
{
public void speak()
{
System.out.println("Dog can not speak: wang wang ...");
}
public void run()
{
System.out.println("I am a dog, I can run at speed of 20km/h.");
}
}
class AnimalProxy implements InvocationHandler
{
private Object target;
public Object bind(Object target)
{
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
return method.invoke(target, args);
}
}
测试
/**
* @param args
*/
public static void main(String[] args) {
DynamicProxy dynamicProxyTester = new DynamicProxy();
AnimalProxy proxy = dynamicProxyTester.new AnimalProxy();
People person = dynamicProxyTester.new People();
Dog dog = dynamicProxyTester.new Dog();
Animal personProxy = (Animal)proxy.bind(person);
personProxy.speak();
personProxy.run();
Animal dogProxy = (Animal)proxy.bind(dog);
dogProxy.speak();
dogProxy.run();
}
}