簡體   English   中英

Java-使用特定名稱創建匿名Exception子類

[英]Java - Create anonymous Exception subclass with a certain name

我們正在使用Fabric / Crashlytics將非崩潰問題發送到其服務器,並在以后檢查日志和堆棧跟蹤。

不幸的是,Crashlytics API要求對不同的問題類型使用不同的Exception子類實例。 (在iOS SDK中,您可以僅將字符串用於不同的問題類型,但在Android版本中則不能)。

public static void craslyticsRecordError(String issueType, String errorMsg)
{
    Exception e = new Exception(issueType + "-" + errorMsg);
    Crashlytics.logException(e);
}

現在,我們有了許多不同的問題類型,我們還在運行時動態定義了它們(從字符串部分一起構建)。 因此,問題是,是否可以使用某些Java Vodoo / Hacks(反思?)在運行時創建具有特定名稱(我們用作問題類型的字符串的名稱)的子類,然后從中創建實例。

這可能嗎?


我現在擺弄ByteBuddy,試圖使其正常工作-但我一直堅持讓動態類正確調用超類構造函數。 另外,我不太確定以后是否可以將其強制轉換為Exception。


感謝拉斐爾·溫特豪德(Rafael Winterhalter),我將這件事付諸實踐更進一步了;)我已經盡力為您提供了:

public static void craslyticsRecordError(String issueType, String errorMsg)
{
    Class<? extends Exception> dynamicType = new ByteBuddy()
            .subclass(Exception.class)
            .name(issueType)
            .make()
            .load(Fabric.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
            .getLoaded();
    try
    {
        Exception e = dynamicType.getConstructor(String.class).newInstance(errorMsg);

        GameLog.d("[Fabric] Inner Exception: " + e);
        Crashlytics.logException(e);
    }
    catch (Exception e1)
    {
        Exception e = new Exception(issueType + "-" + errorMsg);
        GameLog.d("[Fabric] ERROR ONE");
        Crashlytics.logException(e);
        e1.printStackTrace();
    }
}

現在我遇到了這個運行時異常:

java.lang.NoClassDefFoundError: net.bytebuddy.dynamic.loading.NoOpClassFileTransformer
     at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.<init>(ByteArrayClassLoader.java:136)
     at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.of(ByteArrayClassLoader.java:187)
     at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.load(ByteArrayClassLoader.java:212)
     at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$WrappingDispatcher.load(ClassLoadingStrategy.java:285)
     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:4376)
     at org.utils.Fabric.craslyticsRecordError(Fabric.java:47)
     at android.os.MessageQueue.nativePollOnce(Native Method)
     at android.os.MessageQueue.next(MessageQueue.java:323)
     at android.os.Looper.loop(Looper.java:143)
     at android.app.ActivityThread.main(ActivityThread.java:7224)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

現在,使用以下特定於Android的代碼:

Class<? extends Exception> dynamicType = new ByteBuddy()
        .subclass(Exception.class)
        .name(issueType)
        .make()
        .load(Fabric.class.getClassLoader(), AndroidClassLoadingStrategy.Default.WRAPPER)
        .getLoaded();

並使用Android專用的gradle編譯行:

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

我仍然面臨與以前相同的運行時異常。

默認情況下,Byte Buddy復制其超類的構造函數。 在您的情況下,它將復制所有Exception構造函數,並且您可以生成如下所示的異常:

Class<? extends Exception> dynamicType = new ByteBuddy()
  .subclass(Exception.class)
  .name(issueType)
  .make()
  .load(Fabric.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
  .getLoaded();

 Exception e = dynamicType.getConstructor(String.class).newInstance(errorMsg);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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