试图使用https://github.com/japlscript/obstmusic交谈苹果音乐应用程序在macOS与Java,我曾经编写原生AppleScript,然后java Applescript库,但从Java删除。
在这个方法中,它会查找一个名为songkong的现有文件夹播放列表,找到后返回。如果不存在,则创建这样一个文件夹,然后返回。
private FolderPlaylist getPlayListFolder()
{
Application app = Application.getInstance();
com.tagtraum.macos.music.Playlist[] songKongPlaylists = app.getPlaylists();
for(com.tagtraum.macos.music.Playlist next:songKongPlaylists)
{
if(next.getName().equals("songkong"))
{
return (com.tagtraum.macos.music.FolderPlaylist)next;
}
}
Object songkongPlaylist = app.make(FolderPlaylist.class);
if(songkongPlaylist instanceof FolderPlaylist)
{
((FolderPlaylist)songkongPlaylist).setName("songkong");
return ((FolderPlaylist)songkongPlaylist);
}
return null;
}
我第一次运行它时,我必须创建一个文件夹播放列表,因为它不存在,但如果我再次运行,它会找到一个现有的文件夹播放列表,它就会失败,如下所示
2022年4月4日14.53.25:英国夏令时:OSXUpdate iTunesWithChanges:UpdateTunes:严重:***无法运行itunes update:class jdk。proxy2。无法将$Proxy62转换为com类。塔特拉姆。macos。音乐FolderPlaylist(jdk.proxy2.$Proxy62位于loader“app”的模块jdk.proxy2中;com.tagtraum.macos.music.FolderPlaylist位于loader“app”的未命名模块中)java。lang.ClassCastException:类jdk。proxy2。无法将$Proxy62转换为com类。塔特拉姆。macos。音乐FolderPlaylist(jdk.proxy2。$Proxy62位于加载器“app”的模块jdk.proxy2中;com.tagtraum.macos.music.FolderPlaylist位于加载器“app”的未命名模块中)。J思考。宋空。ituneshelper。OSXuUpdate音乐更改。GetPlayFolder(OSXUpdateMusicWithChanges.java:41)位于com。J思考。宋空。ituneshelper。OSXuUpdate音乐更改。在com上创建播放列表(OSXUpdateMusicWithChanges.java:56)。J思考。宋空。ituneshelper。OSXUpdate iTunesWithChanges。com上的分析文件(OSXUpdateItunesWithChanges.java:246)。J思考。宋空。ituneshelper。OSXUpdate iTunesWithChanges。在com上更新tunes(OSXUpdateItunesWithChanges.java:126)。J思考。宋空。ituneshelper。更新TunesWithChanges。在com上调用(updateTunesWithChanges.java:184)。J思考。宋空。ituneshelper。更新TunesWithChanges。在java上调用(updateTunesWithChanges.java:33)。基本/java。util。同时发生的未来任务。在java上运行(FutureTask.java:264)。基本/java。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1136)。基本/java。util。同时发生的ThreadPoolExecutor$工作者。运行(ThreadPoolExecutor.java:635)
我没有使用模块,所以我认为引用模块可能会产生误导。更有可能的是,我不得不做一些事情,而不仅仅是从播放列表(Playlist)转换到文件夹播放列表(FolderPlaylist),但我找不到其他选择。
好的,我解决了这个问题,您必须使用Reference
cast()
方法,而不是执行常规的Java cast
例如
for(com.tagtraum.macos.music.Playlist next:songKongPlaylists)
{
if(next.getName().equals("songkong"))
{
return next.cast(FolderPlaylist.class);
}
}
但我不明白为什么会这样,我想这只是java方式和苹果方式之间的不完美映射。
ObstMusic使用JaplScript通过AppleScript与苹果的音乐应用程序对话(方式不完美)。它通过为为音乐的AppleScript类生成的Java接口创建动态代理来实现这一点。
现在,你的代码中发生了什么?
com.tagtraum.macos.music.Playlist[] songKongPlaylists = app.getPlaylists();
在这里,本质上,ObstMusic生成了一个AppleScript片段,它向音乐请求所有播放列表。方法的签名如下:
Playlist[] getPlaylists();
现在,当JaplScript为返回的AppleScript引用生成动态代理时,它必须弄清楚必须使用什么类型。理想情况下,它会查看AppleScript引用(而且可以),以确定要使用的类型。但这将意味着另一次AppleScript往返(或者不是……请参阅下面的更新)。因此,对于大型集合,这可能需要一段时间。出于性能原因,JaplScript只使用您调用的方法中声明的类型。在本例中,播放列表是FolderPlaylist的超类。但由于在动态代理生成期间未指定FolderPlaylist,因此不能简单地对其进行强制转换。这就是为什么您会看到ClassCastException。
所描述的行为显然不是最方便的,因为它不符合通常的Java行为(或者许多其他OO语言的行为)。
如果您想解决这个问题,并且愿意承受性能损失,那么可以通过调用TypeClass TypeClass=SomeJapleScriptProxy,向JapleScript实例询问其真正的AppleScript运行时类型。getTypeClass()。您还可以通过调用,例如,TypeClass tc=Playlist,获取每个音乐应用程序界面的
TypeClass
。等级(注意外壳)。最后,您可以通过调用Set获取所有音乐应用程序界面
将所有这些放在一起,您可以创建一个从真正的
TypeClass
到最特定Java接口的映射,并在您的cast()
调用中使用它,大致如下所示:
Set<java.lang.Class<?>> classes = Application.APPLICATION_CLASSES;
Map<TypeClass, java.lang.Class<?>> typeClassToJava = new HashMap<>();
for (final Class<?> c : classes) {
typeClassToJava.put(TypeClass.fromClass(c), c);
}
使用此映射,您可以迭代返回的播放列表数组,将所有播放列表对象转换为其实际(最具体)类型,并解决您遇到的问题。
2022年4月21日更新:
从版本3.4.11(Obstmusic 0.9.6)开始,JaplScript在创建具有最特定Java接口(适用于AppleScript对象说明符)的动态代理方面做得更好。这意味着,您可能不再需要手动强制转换。
我需要使用jolt转换来完成下面的JSON转换。 需要从重新定义列的列表中创建新列,有时我们只有一个值,有时我们会得到多个值我的输入数据:- 示例 1: 示例2: 例3: 我已经写了如下的颠簸表达 使用上述 Jolt 表达式工作正常,但无法为上述 Jolt 添加列名输出如下 示例 1: 示例2: 在这里,我无法更改列的名称,因为我需要将列更改为如下所示:jolt转换后的预期输出如下所示 示例 1:
问题内容: 我试图将字符串列表从我的Java控制器传递到scala模板。 这是视图代码: 这是临时代码: 我遇到的错误(在Typesafe Activation Compile页面中): 类索引中的render方法不能应用于给定的类型; 必需:scala.collection.immutable.List 找到:java.util.List 原因:实际参数java.util.List无法通过方法调
我正在尝试在iOS设备上播放.pls音频流,但它似乎不工作,这是我当前正在做的;
问题内容: 我有一个数据框(df),看起来像: 对于整个时间序列,我尝试将今天的值除以昨天,并使用以下命令记录结果: 但是我得到以下错误: 我怎样才能解决这个问题?我试图使用以下方法将其转换为float: 但是什么也无法工作。 问题答案: 您可以改用numpy.log。Math.log需要一个数字,而不是数组。
所以我用javafx制作了一个mp3播放器,它有一个,在这里我拖放歌曲,然后选择一首歌曲并按play播放,你就明白了。问题是,用我当前的代码,我不能播放两首以上歌曲的序列:/(播放选定的歌曲,播放它旁边的歌曲,然后停止)。代码如下:
我已经创建了一个非常简单和基本的html5音频播放器,实际上不超过: 但我面临两个问题,这个简单的音频标签在Chrome上可以使用,但在Safari 7上不行;第二个问题是,它不能在我的iPhone iOS7和HTC Android 2.3上使用