2017-10-12 5 views
1

"Hello World!"를 만들었습니다. 성공적으로 컴파일되고 실행 된 Android Studio의 Android 애플리케이션. 다음 "Hello World!"를 추가했습니다.ByteBuddy Android가로드시 충돌합니다 (getClass(). getClassLoader())

10-12 11:47:59.977 30562-30562/com.example.bytebuddyandroid D/AndroidRuntime: Shutting down VM 


    --------- beginning of crash 

10-12 11:47:59.979 30562-30562/com.example.bytebuddyandroid E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.bytebuddyandroid, PID: 30562 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bytebuddyandroid/com.example.bytebuddyandroid.MainActivity}: java.lang.UnsupportedOperationException: Cannot define class using reflection 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: java.lang.UnsupportedOperationException: Cannot define class using reflection 
     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Unavailable.defineClass(ClassInjector.java:821) 
     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.inject(ClassInjector.java:185) 
     at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:187) 
     at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default.load(ClassLoadingStrategy.java:120) 
     at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:79) 
     at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:4456) 
     at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:4446) 
     at com.example.bytebuddyandroid.MainActivity.onCreate(MainActivity.java:22) 
     at android.app.Activity.performCreate(Activity.java:5990) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  
     at android.app.ActivityThread.access$800(ActivityThread.java:151)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:135)  
     at android.app.ActivityThread.main(ActivityThread.java:5254)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at java.lang.reflect.Method.invoke(Method.java:372)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  
    Caused by: java.lang.IllegalStateException: This JVM's version string does not seem to be valid: 0 
     at net.bytebuddy.ClassFileVersion$VersionLocator$ForLegacyVm.locate(ClassFileVersion.java:388) 
     at net.bytebuddy.ClassFileVersion.ofThisVm(ClassFileVersion.java:147) 
     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$CreationAction.run(ClassInjector.java:301) 
     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$CreationAction.run(ClassInjector.java:290) 
     at java.security.AccessController.doPrivileged(AccessController.java:45) 
     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.<clinit>(ClassInjector.java:70) 
     at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:184) 
     at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default.load(ClassLoadingStrategy.java:120)  
     at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:79)  
     at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:4456)  
     at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:4446)  
     at com.example.bytebuddyandroid.MainActivity.onCreate(MainActivity.java:22)  
     at android.app.Activity.performCreate(Activity.java:5990)  
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)  
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)  
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  
     at android.app.ActivityThread.access$800(ActivityThread.java:151)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:135)  
     at android.app.ActivityThread.main(ActivityThread.java:5254)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at java.lang.reflect.Method.invoke(Method.java:372)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  



    --------- beginning of system 

왜 : ByteBuddy 번호 :

Class<?> dynamicType = new ByteBuddy() 
       .subclass(Object.class) 
       .method(ElementMatchers.named("toString")) 
       .intercept(FixedValue.value("Hello World!")) 
       .make() 
       .load(getClass().getClassLoader()) 
       .getLoaded(); 

다음 I 추가 한 의존성 다음 로그 캣 출력과

.load(getClass().getClassLoader()) 

라인 실행 중에

compile 'net.bytebuddy:byte-buddy-android:1.7.6' 

애플리케이션은 추락

"java.lang.UnsupportedOperationException: Cannot define class using reflection" 

예외가 발생 했습니까? 이 예외를 피하기 위해해야 ​​할 일은 무엇입니까?

+0

build.gradle – Zoe

답변

3

좋아, 나는 ClassLoadingStrategy를 지정하는 인수로 다른 버전의 load()를 사용해야했다. 그래서 그것을

.load(getClass().getClassLoader(), new AndroidClassLoadingStrategy.Wrapping(this.getDir("dexgen", Context.MODE_PRIVATE))) 

으로 변경했습니다!