当前页面: 开发资料首页 → Java 专题 → 动态委托及其应用
摘要: 动态委托及其应用
Class clazz = Proxy.getProxyClass(
Idel1.class.getClassLoader(),
new Class[] { Idel1.class, Idel2.class });
//The delegation class is a sub-class of the class to be delegated
public class TestBeanDelegation extends TestBean
implements Delegation {
//The object to be delegated
TestBean bean;
//The invocation handler
DelegationInvocationHandler handler;
...
static Method m0 = null;
...
static {
...
try {
m0 = TestBean.class.getMethod("getName",
new Class[] {});
} catch (Exception exception) {
}
...
}
public TestBeanDelegation(Object bean) {
this.bean = (TestBean)bean;
}
public String getName() {
boolean goon = true;
String ret = null;
Throwable t = null;
try {
goon = handler.invokeBefore(bean,
m0, new Object[] {});
if (goon)
try {
ret = bean.getName();
} catch (Throwable throwable) {
t = throwable;
}
if (t != null)
ret = handler.invokeAfterException(bean,
m0, new Object[] {}, t);
else
ret = handler.invokeAfter(bean,
m0, new Object[] { name }, null);
return ret;
} catch (RuntimeException e) {
throw e;
} catch (Error e) {
throw e;
} catch (Throwable throwable) {
throw new UndeclaredThrowableException(throwable);
}
}
}
//ConcreteClass.java
package org.jingle.util.dydelegation.sample;
public class ConcreteClass {
public void hello() {
System.out.println("Hello from ConcreteClass");
}
protected void hello2() {
System.out.println("Hello again from ConcreteClass");
}
}
//ConcreteClassTest.java
package org.jingle.util.dydelegation.sample;
import org.jingle.util.dydelegation.DelegationGenerator;
public class ConcreteClassTest {
public static void main(String[] args) {
Class clazz = DelegationGenerator
.getDelegationClass(new Class[] { ConcreteClass.class });
System.out.println("Delegation class name = " +
clazz.getName());
System.out.println(
ConcreteClass.class.isAssignableFrom(clazz));
}
}
//object to be delegated
Object obj = ...;
//some concrete invocation handler instance
DelegationInvocationHandler h = ...;
Constructor c = clazz.getConstructor(new Class[] { Object.class });
Object inst = c.newInstance(new Object[] {obj});
((Delegation) inst)._setInvocationHandler(h);
//AbstractClass.java
package org.jingle.util.dydelegation.sample;
public abstract class AbstractClass {
public abstract void wave();
}
//AbstractClassTest.java
package org.jingle.util.dydelegation.sample;
import java.lang.reflect.Modifier;
import org.jingle.util.dydelegation.DelegationGenerator;
public class AbstractClassTest {
public static void main(String[] args) {
Class clazz = DelegationGenerator
.getDelegationClass(new Class[] { AbstractClass.class });
System.out.println("Delegation class name = " +
clazz.getName());
System.out.println(
Modifier.isAbstract(clazz.getModifiers()));
}
}
//Idel1.java
package org.jingle.util.dydelegation.sample.bean;
public interface Idel1 {
public void idel1();
}
//Idel2.java
package org.jingle.util.dydelegation.sample.bean;
public interface Idel2 {
public void idel2();
}
//ComplexClassTest.java
package org.jingle.util.dydelegation.sample;
import org.jingle.util.dydelegation.DelegationGenerator;
import org.jingle.util.dydelegation.sample.bean.Idel1;
import org.jingle.util.dydelegation.sample.bean.Idel2;
public class ComplexClassTest {
public static void main(String[] args) {
Class clazz = DelegationGenerator.getDelegationClass(new Class[] {
ConcreteClass.class, Idel1.class, Idel2.class });
System.out.println(
Idel1.class.isAssignableFrom(clazz));
System.out.println(
Idel2.class.isAssignableFrom(clazz));
System.out.println(
ConcreteClass.class.isAssignableFrom(clazz));
}
}
// ConcreteClassTest2.java
package org.jingle.util.dydelegation.sample;
import java.lang.reflect.Method;
import org.jingle.util.dydelegation.DelegationGenerator;
import org.jingle.util.dydelegation.DelegationInvocationHandler;
import org.jingle.util.dydelegation.DummyInvocationHandler;
public class ConcreteClassTest2 {
public static void main(String[] args) {
ConcreteClass inst = new ConcreteClass();
DelegationInvocationHandler handler =
new SimpleHandler();
ConcreteClass delegation = (ConcreteClass)
DelegationGenerator.newDelegationInstance(inst, handler);
delegation.hello();
delegation.hello2();
System.out.println(delegation.toString());
}
}
class SimpleHandler extends DummyInvocationHandler {
public boolean invokeBefore(Object bean,
Method method, Object[] args)
throws Throwable {
System.out.println("Interrupted by SimpleHandler");
return super.invokeBefore(bean, method, args);
}
}
//DateTest.java
package org.jingle.util.dydelegation.sample;
import java.lang.reflect.Method;
import java.util.Date;
import org.jingle.util.dydelegation.DelegationGenerator;
import org.jingle.util.dydelegation.DelegationInvocationHandler;
import org.jingle.util.dydelegation.DummyInvocationHandler;
public class DateTest {
public static void main(String[] args) {
Date date = new Date();
DelegationInvocationHandler handler =
new DateClassHandler();
Date delegation = (Date) DelegationGenerator
.newDelegationInstance(date, handler);
System.out.println("Delegation class = " +
delegation.getClass().getName());
System.out.println("True date = " +
date.getTime());
System.out.println("Delegation date = " +
delegation.getTime());
}
}
class DateClassHandler extends DummyInvocationHandler {
public Object invokeAfter(Object bean,
Method method, Object[] args,
Object result) throws Throwable {
if (method.getName().equals("getTime")) {
return new Long(((Long)result).longValue() - 1000);
}
return super.invokeAfter(bean, method, args, result);
}
}
// ProxyTest.java
package org.jingle.util.dydelegation.sample;
import java.lang.reflect.Method;
import org.jingle.util.dydelegation.DelegationGenerator;
import org.jingle.util.dydelegation.DelegationInvocationHandler;
import org.jingle.util.dydelegation.DummyInvocationHandler;
import org.jingle.util.dydelegation.sample.bean.Idel1;
import org.jingle.util.dydelegation.sample.bean.Idel2;
public class ProxyTest {
public static void main(String[] args) {
DelegationInvocationHandler handler = new ProxyHandler();
Object delegation =
DelegationGenerator.newDelegationInstance(null,
new Class[] { Idel1.class, Idel2.class },
null, handler);
((Idel1) delegation).idel1();
((Idel2) delegation).idel2();
}
}
class ProxyHandler extends DummyInvocationHandler {
public boolean invokeBefore(Object bean,
Method method, Object[] args)
throws Throwable {
return false;
}
public Object invokeAfter(Object bean,
Method method, Object[] args,
Object result) throws Throwable {
String name = method.getName();
if (name.equals("idel1"))
System.out.println("Hello from idel1");
else if (name.equals("idel2"))
System.out.println("Hello from idel2");
return super.invokeAfter(bean, method, args, result);
}
}
//MyDate.java
package org.jingle.util.dydelegation.sample.bean;
import java.util.Date;
public class MyDate extends Date implements Idel1, Idel2 {
public void idel1() {
}
public void idel2() {
}
}
// MyDateTest.java
package org.jingle.util.dydelegation.sample;
import java.util.Date;
import org.jingle.util.dydelegation.DelegationGenerator;
import org.jingle.util.dydelegation.DelegationInvocationHandler;
import org.jingle.util.dydelegation.DummyInvocationHandler;
import org.jingle.util.dydelegation.sample.bean.Idel1;
import org.jingle.util.dydelegation.sample.bean.Idel2;
import org.jingle.util.dydelegation.sample.bean.MyDate;
public class MyDateTest {
public static void main(String[] args) {
MyDate inst = new MyDate();
DelegationInvocationHandler handler =
new DummyInvocationHandler();
Object delegation =
DelegationGenerator.newDelegationInstance(inst,
new Class[] { Idel1.class, Idel2.class },
null, handler);
System.out.println(delegation instanceof Idel1);
System.out.println(delegation instanceof Idel2);
System.out.println(delegation instanceof Date);
}
}