[英]How would you call a non-abstract method of a abstract class?
該課題回答了處理抽象方法類型的問題; 但是如何代理方法的非抽象部分呢? 在運行時實現抽象方法?
我如何執行以下命令來調用sayHello()
?
軟件包cglibtest;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGLibTest
{
public static void main(String... args)
{
MyAbstract instance = (MyAbstract)Enhancer.create(MyAbstract.class, new MyInterceptor(42));
System.out.println("Value from instance: " + instance.valueMethod());
System.out.println("Value from instance: " + instance.sayHello());
}
public static class MyInterceptor implements MethodInterceptor
{
private final Object constantValue;
public MyInterceptor(Object constantValue)
{
this.constantValue = constantValue;
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable
{
if ("valueMethod".equals(method.getName()))
return(constantValue);
else
return(null);
}
}
public static abstract class MyAbstract
{
public abstract int valueMethod();
public String sayHello() { return "Hello" };
}
}
您創建的攔截器已經覆蓋了所有方法,無論是否abstract
。 您似乎錯過的是如何調用已覆蓋的原始方法:
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable
{
if ("valueMethod".equals(method.getName()))
return constantValue;
else if("sayHello".equals(method.getName())) {
System.out.println("before original sayHello()");
// equivalent of saying super.sayHello() inside subclass
Object result=proxy.invokeSuper(obj, args);
System.out.println("after original sayHello()");
return result;
}
else return null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.