java - 如何调用抽象类的非抽象方法?

标签 java java-bytecode-asm cglib

这个问题回答了处理抽象方法类型;但如何代理方法的非抽象部分呢? 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/

相关文章:

java - Android Volley如何捕获多次发送中的超时错误

java - Jasper Report嵌套子报表不显示

java - 服务器的 Bounce 和 BootUp 有什么区别?

java - CGLib - 创建一个带有一些字段的 bean 并在它们上面放置注释?

java - 如何重写实例/具体类的方法运行时? (例如反射、cglib)

java - 升级到 Spring 3 后启动缓慢

java - 如何更改或使用创建对象的类中的变量?

java - 如何验证和编写测试用例以检查 ASM/Byte Buddy 实例是否在运行时创建

java - 如何使用 java agent 和 ASM 监控对象创建?

java - 对象不是声明类的实例