首先,我不确定如何最好地表达我的解决方案,所以如果我有时看起来在胡言乱语,那么请考虑这一点。
我希望在不接触物理代码的情况下修改库中的一个接口,
public interface ProxiedPlayer {
// .. other code
public void setPermission(String permission, boolean state);
}
Run Code Online (Sandbox Code Playgroud)
我已经编写了一个第三方库来处理权限,并且必须连接到我的 API 来编辑权限可能是一些开发人员不想采取的步骤。所以我问,当setPermission调用时是否可以让它调用我的库中的适当方法来处理权限设置,同时忽略预编程的代码?
这是我尝试代理的完整界面。
我已经研究过 Java Proxy 类,但似乎您首先需要尝试代理的对象的实例。鉴于可以随时调用该方法,我不相信这是我的解决方案,但很乐意纠正。
我无法控制实现 ProxiedPlayer 接口的类的实例化。
编辑:无知的我,我可以订阅几个可以获取播放器实例的事件,这是否是尝试代理该方法的适当位置?当玩家加入服务器并且可以获取玩家的实例时,会触发其中一个事件。
是否需要为 ProxiedPlayer 接口的每个实例调用代理代码,或者是否可以以更简单的方式简单地代理该方法的每个调用?
我的库是一个在其他必需的内容完成加载后加载的插件。
编辑#2:
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class InvocationProxy implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ProxiedPlayer player = (ProxiedPlayer) proxy;
if(method.getName().equals("setPermission")) {
// Call my code here?
}
return …Run Code Online (Sandbox Code Playgroud) 我试图获取提供的html(span)之间的数据(在本例中为31)
这是原始代码(来自chrome中的inspect元素)
Run Code Online (Sandbox Code Playgroud)<span id="point_total" class="tooltip" oldtitle="Note: If the number is black, your points are actually a little bit negative. Don't worry, this just means you need to start subbing again." aria-describedby="ui-tooltip-0">31</span>
我有一个包含页面源的富文本框,这里是相同的代码,但在富文本框的第51行:
Run Code Online (Sandbox Code Playgroud)<DIV id=point_display>You have<BR><SPAN id=point_total class=tooltip jQuery16207621750175125325="23" oldtitle="Note: If the number is black, your points are actually a little bit negative. Don't worry, this just means you need to start subbing again.">17</SPAN><BR>Points </DIV><IMG style="FLOAT: right" title="Gain subscribers" border=0 alt="When people subscribe to you, you lose a point" src="http://static.subxcess.com/images/page/decoration/remove-1-point.png"> </DIV> …
我即将踏上编写java库来包装Web API的旅程,我想在此过程中编写测试,以确保一切都很好.我已经使用JUnit很长一段时间了,并且非常适合使用它和PowerMockito/Mockito这样的工具.然而,我担心如果API关闭或我无法访问它,测试可能会失败,因为我最终计划在CI服务器(travis-ci)上运行它,并希望build-test-deploy过程为尽可能接近自动化.
我已经做了很多谷歌搜索,不幸的是我在这里发现的大部分问题都是关于测试程序员已经编写或可以在本地设置的API.我知道可以通过一点点的修补来复制API的基本功能,尽管这感觉更像是向前退一步而不是前进.
我目前正在脑海中起草创意,到目前为止,这感觉就像是一个中等可靠的解决方案,尽管如果有人能够验证这一点或者提供更好的解决方案,那就太好了.
TestUtil.java
public static boolean isReachable() {
try (Socket socket = new Socket("api.host.com", 80)) {
return true;
} catch (Exception e) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
TestCase.java
@BeforeClass
public static void testReachable() {
Assume.assumeTrue("API was not reachable, test cannot run", TestUtil.isReachable());
}
Run Code Online (Sandbox Code Playgroud)
我@BeforeClass只是出于偏执而假设它.
但是,这不会解决HTTP错误,只会检查是否有东西在端口80上侦听.是否值得替换HEAD请求?除了检查错误,我真的不确定.我不愿意使用HTTP而没有确认它是最好的方法,因为这个库有可能变得非常大.
编辑:
我只是偶然发现InetAddress#isReachable(),虽然根据我正在阅读的一篇文章,它并不是最可靠的.
老实说,在线程方面我是一个了不起的菜鸟。这实际上是从文档中乱七八糟地拼凑在一起的,它甚至可能不正确或不必要。
我正在使用我创建的一个类来从 Mojang 的 API 获取数据,这些方法是静态的,我不确定如何处理 JSONParser (json-simple 库)对象的使用。
我的原始代码就在这个要点上
,我正在试验的代码在这里。在第二个要点中,我将 JSONParser 设为静态,并指出它不是线程安全的,我使用 gettersynchronized在需要时访问它,而在第一个要点中,我JSONParser为每个方法调用创建一个新对象。
考虑到代码通常会在另一个线程上运行,这是我有效访问静态 JSONParser 的方式,还是我最好坚持第一个要点中的代码?