一、java编程思想反射章节的动态代理实现代码展示
package com.lattice.dtagency;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Person{
void doSomeThing();
void doSomeThingElse(String arg);
}
class Peter implements Person{
@Override
public void doSomeThing() {
System.out.println("Peter likes fishing!");
}
@Override
public void doSomeThingElse(String arg) {
System.out.println("Peter else likes swimming!"+arg);
}
}
class Merry implements Person{
@Override
public void doSomeThing() {
System.out.println("Merry likes dancing!");
}
@Override
public void doSomeThingElse(String arg) {
System.out.println("Merry else likes watching movies!"+arg);
}
}
/**
* 静态代理类
**/
class Lucy implements Person{
private Person person;
public Lucy(Person person){
this.person=person;
}
public void getPerson(Person person){
this.person=person;
}
@Override
public void doSomeThing() {
this.person.doSomeThing();
}
@Override
public void doSomeThingElse(String arg) {
this.person.doSomeThingElse(arg);
}
}
/*
* 动态代理类
*/
class Maria implements InvocationHandler{
private Object person;
public Maria(Object person){
this.person=person;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("\n_____person\t:"+person.getClass()+
"\nmethod:"+method+"\targs"+args);
if(args!=null){
for(Object arg:args){
System.out.println("+++++++"+arg);
}
}
return method.invoke(person, args);
}
}
public class Afgency {
public static void doWork(Person person){
person.doSomeThing();
System.out.println("******************");
person.doSomeThingElse("---------------------");
}
public static void main(String [] args){
//doWork(new Lucy(new Peter()));
//动态代理对象创建
Person person=(Person)Proxy.newProxyInstance(Person.class.getClassLoader()
, new Class[]{Person.class}, new Maria(new Peter()));
doWork(person);
}
}
二、结果展示
_____person :class com.lattice.dtagency.Peter
method:public abstract void com.lattice.dtagency.Person.doSomeThing() argsnull
Peter likes fishing!
_____person :class com.lattice.dtagency.Peter
method:public abstract void com.lattice.dtagency.Person.doSomeThingElse(java.lang.String) args[Ljava.lang.Object;@1a3a2a52
+++++++———————
Peter else likes swimming!———————