考虑这个(恕我直言)简单的例子:
public class DecompilerTest {
public static void main(String[] args) {
Object s1 = "The", s2 = "answer";
doPrint((Object) "You should know:");
for (int i = 0; i < 2; i++) {
doPrint(s1);
doPrint(s2);
s1 = "is";
s2 = new Integer(42);
}
System.out.println();
}
private static void doPrint(String s1) {
System.out.print("Wrong!");
}
private static void doPrint(Object s1) {
System.out.print(s1 + " ");
}
}
Run Code Online (Sandbox Code Playgroud)
在没有调试信息的情况下用源/目标级别1.1编译它(即不应存在局部变量信息)并尝试对其进行反编译.我尝试过Jad,JD-GUI和Fernflower,他们都至少有一个错误的调用(即程序打印"错误!"至少一次)
真的没有java反编译器可以推断出正确的强制转换,以便它不会调用错误的重载吗?
编辑:目标级别1.1,以便不存在特定于Java6的快速验证信息.这可能会给反编译器一个线索,即s1已被声明为Object而不是String.即使没有这些信息,反编译器也应该能够反编译代码(不一定得到原始变量类型,但显示相同的行为),特别是因为许多混淆器也将它剥离.
反编译器出了什么问题:
(Object)在第一次通话中错过了演员.s1要String …我正在挖掘Google的免费(开源)Java差异库的结果,并且似乎有很多(其中一些甚至使用通用对象而不仅仅是使用字符串).
在我挖掘大量搜索结果而没有找到我正在搜索的内容之前,我先问一下:
这些差异库是否支持cvs annotate或svn blame等功能.我想要
String[]传递给函数String[]函数传递给函数,直到我用完所有版本,或者库告诉我没有原始行未被注释(最后一件事不是必须但非常有用,因为检索旧版本的String[]很贵,所以我想尽早停下来)ìnt[]告诉我当前版本的每一行,它在哪个版本上次更改或者它是否根本没有改变(即最后一个版本中的最后一个更改).支持非Strings的对象很好,但没有必要.如果API不完全那样,我想我可以忍受它.
如果没有,任何人都可以建议一个可扩展的差异库,其中可以轻松添加该功能,最好是希望接收该功能作为贡献(并且在接受贡献之前不需要填充大量文书工作,例如GNU项目)?然后,我会自愿(至少尝试)将其添加到那里.
使用JSP或转换为Java源代码(或存根)的其他语言时,通常会生成一个SMAP文件,稍后可以将其嵌入到Class文件中以供调试器显示更好的堆栈跟踪(或者在Jasper的情况下)它会自动嵌入).
有一个旧的JVM错误(或RFE)来添加支持以在堆栈跟踪中包含SMAP信息,但由于缺乏活动,似乎Sun/Oracle人员更喜欢每个人自己后处理他的堆栈跟踪.
所以这是我的问题:如何做到这一点?周围的图书馆是否为您做了艰苦的工作,或者您是否必须自己实施一切?
我已经找到了一个好地方,我可以访问异常对象和加载"SMAP enabled"类的类加载器.现在我必须
而且因为它似乎是一个单调乏味且容易出错的任务,我希望有人已经这样做了,我只需要为我的依赖项添加一个库,并makeStacktraceFancy为我的异常调用一个方法,以便在我记录它们之前使堆栈跟踪变得有趣.
考虑以下示例代码,它使用 aTrustManager来记录传出连接是否使用有效证书(但在所有情况下接受连接):
import java.security.*;
import java.security.cert.*;
import javax.net.ssl.*;
public class CertChecker implements X509TrustManager {
private final X509TrustManager defaultTM;
public CertChecker() throws GeneralSecurityException {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore)null);
defaultTM = (X509TrustManager) tmf.getTrustManagers()[0];
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
if (defaultTM != null) {
try {
defaultTM.checkServerTrusted(certs, authType);
System.out.println("Certificate valid");
} catch (CertificateException ex) {
System.out.println("Certificate invalid: " + ex.getMessage());
}
}
}
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public X509Certificate[] getAcceptedIssuers() { return …Run Code Online (Sandbox Code Playgroud) 我不认为这很难,只是单调乏味:一些小的免费(如在啤酒中)库,我可以放入一个像1,2-9,33这样的字符串,它可以告诉我一个给定的数字是否匹配表达.就像大多数程序在其打印范围对话框中一样.仅用于匹配奇数或偶数的特殊函数,或匹配每个2 mod 5(或类似的东西)的数字将是不错的,但不是必需的.
我必须在此列表上执行的唯一操作是范围是否包含给定(非负)整数值; 当然,更多的操作,如最大/最小值(如果它们存在)或迭代器会很好.
如果有人输入1-10000000但是我将要查询的唯一数字是12345,那么它不会占用大量内存需要什么:-)
(为了实现它,我会将列表解析为几个(min/max/value/mod)对,例如1,10,0,1为1-10或11,33,1,2为1-33odd,或12 ,12,22/10的62,2,10(即12,22,32,...,62),然后检查所有间隔的每个数字.使用Integer.MaxValue等打开间隔.如果没有库,任何想法做得更好/更有效?)
我必须比较HTML页面的不同版本以进行格式化和文本更改.不幸的是,创建它们的人/公司使用某种HTML编辑器,每次重新包装所有HTML(并增加大量的空白),这使得很难区分它们.所以我正在寻找一种工具(最好是一个Java库),它可以重新格式化我的HTML,以便删除所有无关紧要的空格和换行符.
这意味着,在
<h1>First Headline</h1> <h2>Second headline</h2>
Run Code Online (Sandbox Code Playgroud)
之间的空间</h1>,并<h2>应被删除,但在
<b>formatted</b> <i>text</i>
Run Code Online (Sandbox Code Playgroud)
空格可能无法删除.我不关心<pre>,<textarea>或<script>阻止,也不关心可以改变行为的CSS空白属性 - 我只是在寻找一个解决大多数不必要的空白的解决方案(最好留下太多的空白而不是太少).
(我已经折叠了多个空格并在标签之前重新添加换行符而不是空格,以使文本更具可读性 - 但是仍有太多情况,例如标题或表格单元格/行之间的新换行符打破了我的简单"解决方案" .)
java ×6
annotate ×1
blame ×1
bytecode ×1
certificate ×1
decompiler ×1
diff ×1
expression ×1
html ×1
jad ×1
jsp ×1
numbers ×1
parsing ×1
ssl ×1
whitespace ×1