这个问题回答了处理抽象方法类型;但如何代理方法的非抽象部分呢? Implementing abstract methods at runtime?
如何执行以下代码来调用 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" };
}
}
最佳答案
您创建的拦截器已经覆盖了所有方法,无论是否是抽象的。您似乎错过了如何调用您已覆盖的原始方法:
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;
}
关于java - 如何调用抽象类的非抽象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25243946/