【IT168 技术】类定义:
1、被代理接口和实现类
Tank类实现了Moveable接口,能够move()
package com.zec.disignmode;
public interface Moveable {
public void move();
}
package com.zec.disignmode;
import java.util.Random;
public class Tank implements Moveable{
@Override
public void move() {
System.out.println("Tank moving....");
try {
Thread.sleep(new Random().nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public interface Moveable {
public void move();
}
package com.zec.disignmode;
import java.util.Random;
public class Tank implements Moveable{
@Override
public void move() {
System.out.println("Tank moving....");
try {
Thread.sleep(new Random().nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2、代理加工接口和实现类
TimeHandler类实现了InvocationHandler接口,能够invoke(Object object,Method m)在object的m方法前后加上自己记录时间的逻辑,并不是代理类,只是提供了对被代理类的加工逻辑。
package com.zec.disignmode;
import java.lang.reflect.Method;
public interface InvocationHandler {
public void invoke(Object o,Method m);
}
package com.zec.disignmode;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TimeHandler implements InvocationHandler{
@Override
public void invoke(Object object, Method m) {
System.out.println("Time Before "+m.getName());
try {
m.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Time After "+m.getName());
}
}
import java.lang.reflect.Method;
public interface InvocationHandler {
public void invoke(Object o,Method m);
}
package com.zec.disignmode;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TimeHandler implements InvocationHandler{
@Override
public void invoke(Object object, Method m) {
System.out.println("Time Before "+m.getName());
try {
m.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Time After "+m.getName());
}
}
3、测试类
package com.zec.disignmode;
public class Client {
public static void main(String[] args) {
Moveable m = new Tank();
LogHandler h = new LogHandler();
try {
Moveable moveable = (Moveable) Proxy.newInstance(Moveable.class, h);
moveable.move();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Client {
public static void main(String[] args) {
Moveable m = new Tank();
LogHandler h = new LogHandler();
try {
Moveable moveable = (Moveable) Proxy.newInstance(Moveable.class, h);
moveable.move();
} catch (Exception e) {
e.printStackTrace();
}
}
}