public interface Target {
void eat();
void drink();
}
public class TargetDog implements Target {
public TargetDog() {
}
@Override
public void eat() {
System.out.println("狗在吃.........");
}
@Override
public void drink() {
System.out.println("狗在喝水.........");
}
}
public interface InvocationHanler {
void invoke(Method method,Object[] args);
}
public class ProxyDog implements Target {
InvocationHanler h;
static Method eat=null;
static Method drink=null;
static {
try {
eat = TargetDog.class.getMethod("eat");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
drink = TargetDog.class.getMethod("drink");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
public ProxyDog(InvocationHanler h) {
this.h = h;
}
@Override
public void eat() {
h.invoke(eat,new Object[0]);
}
@Override
public void drink() {
h.invoke(drink,new Object[0]);
}
}
public class TestAgent {
public static void main(String[] args) {
// Target target=(Target)Proxy.newProxyInstance(
// ClassLoader.getSystemClassLoader(),
// TargetDog.class.getInterfaces(),
// new InvocationHandler() {
// @Override
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// System.out.println("before........");
// return method.invoke(TargetDog.class.getConstructor().newInstance(),args);
// }
// }
// );
// target.eat();
ProxyDog proxyDog = new ProxyDog(new InvocationHanler() {
@Override
public void invoke(Method method,Object[] args) {
System.out.println("before.........");
try {
method.invoke(TargetDog.class.getConstructor().newInstance(),args);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
});
proxyDog.eat();
proxyDog.drink();
}
}
before.........
狗在吃.........
before.........
狗在喝水.........
Process finished with exit code 0