簡體   English   中英

您將如何調用抽象類的非抽象方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM