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