2017-01-29 10 views
0

私の英語は申し訳ありませんが、実装に問題があります。インターフェイスの実装でエラーが発生しました

私は抽象クラスメソッド

package br.com.teste; 

public interface IDefault 
{ 
    public String test1(); 
} 

とのインタフェースを有し、私が最初に延びて第2のインタフェースを有するインタフェース

package br.com.teste; 

public abstract class Test implements IDefault 
{ 
    @Override 
    public String test1() 
    { 
     return "Test method Class"; 
    } 
} 

を実装する唯一の方法では、抽象クラスを持っています1つ以上の方法があります。

package br.com.teste; 

public interface ITest extends IDefault 
{ 
    public String test2(); 
} 

インターセプタ

package br.com.teste.intercept; 

import java.lang.reflect.Method; 
import java.util.concurrent.Callable; 
import net.bytebuddy.dynamic.TargetType; 
import net.bytebuddy.implementation.bind.annotation.AllArguments; 
import net.bytebuddy.implementation.bind.annotation.Origin; 
import net.bytebuddy.implementation.bind.annotation.RuntimeType; 
import net.bytebuddy.implementation.bind.annotation.Super; 
import net.bytebuddy.implementation.bind.annotation.SuperCall; 


public class ProxyInvocationHandler 
{ 
    @RuntimeType 
    public static Object intercept(@SuperCall Callable<?> callable, @Super(proxyType = TargetType.class) Object delegate, @Origin Class<?> clazz, @Origin Method method, @AllArguments Object[] args) throws Exception 
    { 
     System.out.println(method.getName()); 
     // 
     return null; 
    } 
} 

私が使用するコード

package br.com.teste; 

import br.com.teste.intercept.ProxyInvocationHandler; 
import net.bytebuddy.ByteBuddy; 
import net.bytebuddy.ClassFileVersion; 
import net.bytebuddy.implementation.MethodDelegation; 
import net.bytebuddy.matcher.ElementMatchers; 


public class Main 
{ 
    @SuppressWarnings("unchecked") 
    public static void main(String... args) 
    { 
     try 
     { 
      ClassLoader classLoader = Main.class.getClassLoader(); 
      Class<? extends ITest> proxyType = (Class<? extends ITest>) new ByteBuddy(ClassFileVersion.JAVA_V8).subclass(Test.class).implement(ITest.class).method(ElementMatchers.any()).intercept(MethodDelegation.to(ProxyInvocationHandler.class)).make().load(classLoader).getLoaded(); 
      ITest test = proxyType.newInstance(); 
      // 
      System.out.println(test.test1()); 
      System.out.println(test.test2()); 
      // 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

エラー

java.lang.IllegalArgumentException: None of [net.bytebuddy.implement[email protected]4d8c5c64] allows for delegation from public abstract java.lang.String br.com.teste.ITest.test2() 
    at net.bytebuddy.implementation.bind.MethodDelegationBinder$Processor.bind(MethodDelegationBinder.java:827) 
    at net.bytebuddy.implementation.MethodDelegation$Appender.apply(MethodDelegation.java:1035) 
    at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyCode(TypeWriter.java:614) 
    at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyBody(TypeWriter.java:603) 
    at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod.apply(TypeWriter.java:521) 
    at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForCreation.create(TypeWriter.java:4102) 
    at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1612) 
    at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:174) 
    at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:155) 
    at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:2560) 
    at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:2662) 
    at br.com.teste.Main.main(Main.java:18) 
+0

'ITest'を'テストする 'べきではありませんか?エラーは 'bytebuddy'のように、インスタンス上でメソッドを呼び出す方法を見つけません。正しいインタフェースを実装していない場合は当然です。 – BeyelerStudios

+0

私はBeyelerStudiosに同意します。あなたのクラスのテストはITestではなくIDefaultを実装しています。したがって、メソッドtest1()にのみアクセスできます。 – DiabolicWords

答えて

0

あなたtest2方法は、階層下に抽象的であり、それは、スーパーメソッド呼び出しを使用して起動することはできません。したがって、@SuperCallアノテーションは、バインド可能バインディング候補としてメソッドを拒否するインスタンスにバインドすることはできません。 にnullをバインドするか、メソッドがバインドできない場合にバイトバディが第2の選択肢とみなす弱い要件の別のインターセプトメソッドを追加するように設定できます。

0

あなたのクラスTestは唯一の方法test1を提供IDefaultインタフェースを実装しています。 test2を宣言するITestインターフェイスは実装されていません。 ITestインターフェイスを実装している場合は、自動的にIDefaultも実装されていることを意味します。

このため、作成したサブクラスTestに利用可能なメソッドtest2が存在しないという例外があります。

0

アプリケーションは正しく、バイトドゥーディーは抽象クラスで宣言されているメソッドを使用する必要があります。 byte-duddyインターフェイスのメソッドだけが空白になりました。 実行されたすべてのメソッドをインターセプトしているので、これらの空白は動的なリターンを生成します。 私はこれにcglibを使いました。

0

私は削除し、「@SuperCall」インターセプタメソッドからのパラメータは、アプリケーションが動作する

@RuntimeType 
public static Object intercept(@Origin Method method, @AllArguments Object[] args, @Super Object delegate) throws Exception 
{ 
    System.out.println(method.getName()); 
    // 
    return null; 
} 
関連する問題