http://java.decompiler.free.fr/?q=jdeclipse
按照说明 在eclipse更新插件就可以。
这样 在一些 闭源的jar文件,你也可以看到 大致的源码。(公司 知道如何 加密混淆 java代码或class文件,居然无法使用jd-gui浏览源码)
而:http://java.decompiler.free.fr/?q=preview 这个页面居然支持 在chrome下 拖拽class到浏览器,然后再反编译 太神奇了(至少不支持IE8)
记录下那个页面的源码
View Code
<html class="js"><script src="chrome-extension://dooekkcihpllpcfoioflgemikhfejpec/injected.js?sk1=false"></script><head><title>Preview | Java Decompiler</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="shortcut icon" href="/sites/default/themes/jd/favicon.ico" type="image/x-icon"><link type="text/css" rel="stylesheet" media="all" href="/css/ad2803645f1f510d8998d3fb4ab2026d.css"><script type="text/javascript" src="/js/10580b65ebdc00fda171cf6ef3b996ec.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- jQuery.extend(Drupal.settings, { "basePath": "/" }); //--><!]]> </script><meta name="keywords" content="decompiler,java,java 1.5,java 5,annotation,generic,enum,jar,free,freeware,decompilation,d�compilateur"><meta name="description" content="Yet another fast Java decompiler"><link rel="alternate" type="application/rss+xml" title="Java Decompiler - News" href="/?q=news/all/rss"><link rel="alternate" type="application/rss+xml" title="Java Decompiler - Last posts" href="/?q=post/all/rss"><link rel="alternate" type="application/rss+xml" title="Java Decompiler - Last comments" href="/?q=comment/all/rss"> </head> <body class="layout-page"><div id="container"><div id="page"><div id="title"><h1><a href="/">Java Decompiler</a></h1><div class="description">Yet another fast Java decompiler</div></div><div id="title-image"></div><div class="header"><div id="block-block-6" class="block block-block"><div class="content"><div id="projects-menu"> <span><a href="/">Home</a></span><span><a href="/?q=jdgui">JD-GUI</a></span><span><a href="/?q=jdeclipse">JD-Eclipse</a></span><span><a href="/?q=jdintellij">JD-IntelliJ</a></span><span class="active"><a href="/?q=preview">Preview</a></span> </div> </div> </div> </div><div id="frame"><div class="node"><h2>Preview</h2><div id="demo" class="content"><script type="text/javascript">var actions= {'hln': function(checked ) { $('#linenumber').css({'display' : checked ? 'none' : 'inline'}); },'ho': function(checked ) { $('kbd', $('#javacode')).css({'display' : checked ? 'none' : 'inline'}); },'mel': function(checked ) { $('s', $('#linenumber')).css({'display' : checked ? 'none' : 'inline'}); $('s', $('#javacode')).css({'display' : checked ? 'none' : 'inline'}); }};function checkboxClicked(checkbox) {$.cookie('demo.config.' + checkbox.id, checkbox.checked ? true : null);actions[checkbox.id](checkbox.checked);}$(document).ready(function(){$('#demo').dndnu({decompilerVersion: '0.7.0-SNAPSHOT-20120129',onEnter: function(e) { $('#demo .in .title').css("background-color","#ff5500");},onLeave: function(e) { $('#demo .in .title').css("background-color","#555555");},onCheckFile: function(file) { return file.size>6 && !!file.name.match('\\.class$')},onCheckAllFiles: function (filtredFiles) {if (filtredFiles.length > 1) {var first = filtredFiles[0].name,pattern='^' + first.substr(0, first.length-6).replace('$','\\$') + '\\$',length=filtredFiles.length,result=new Array();result.push(filtredFiles[0]);for (var i=1; i<length; i++) {if (filtredFiles[i].name.match(pattern)) {result.push(filtredFiles[i]);}}return result} return filtredFiles},onStart: function(files) {var demo=$('#demo'), list=$('.in .list', demo), content='<ul>', first=files[0].name;demo.css("cursor","wait");list.empty();$.each(files, function (k) {content += '<li>' + this.name + '<\/li>';});content += '<\/ul>';$(content).appendTo(list);document.title = first.substr(0, first.length-6) + demo.data('title');},/* onProgress: function(percent) {//$('#demo .in pre').empty();$('#demo .in pre').text(percent+'%');}, */onComplete: function(text) {$('#demo .out .content').replaceWith('<div class="content">' + text + '</div>');$.each($('#demo .config input'), function (k) {if ((this.type == 'checkbox') && !!actions[this.id]) {actions[this.id](this.checked);}});$('#demo').css("cursor","default");}});$.each($('#demo .config input'), function (k) {if (this.type == 'checkbox') {this.checked = ($.cookie('demo.config.' + this.id) == 'true') ? 'true' : '';}});$('#demo').data('title', ' | ' + document.title);});</script><div class="block in"><div class="title">Input Class Files</div><div class="content list">Drop class and inner class files here</div></div><div class="separator"><img src="/sites/default/images/down.gif"></div><div class="block config"><div class="title">Decompiler</div><div class="content"><form action="#"><label for="hln"><input type="checkbox" id="hln" onclick="checkboxClicked(this)">Hide line number</label><br><label for="ho"><input type="checkbox" id="ho" onclick="checkboxClicked(this)">Omit <span class="javacode"><b>this</b></span> if possible</label><br><label for="mel"><input type="checkbox" id="mel" onclick="checkboxClicked(this)">Merge empty lines</label></form></div></div><div class="separator"><img src="/sites/default/images/down.gif"></div><div class="block out"><div class="title">Output Java Code</div><div class="content"></div></div></div> </div> </div><div id="footer"></div></div></div><script src="http://www.google-analytics.com/urchin.js" type="text/javascript"><script type="text/javascript">_uacct="UA-4144628-1";urchinTracker();</script><script src="http://s.skimresources.com/js/28468X864468.skimlinks.js"></script></body><script>(function () {var affect = function() { return {}; }var abjure = function() { }document.getSelection = affect;window.getSelection = affect;window.print = abjure;window.moveTo = abjure;window.moveBy = abjure;window.resizeTo = abjure;window.resizeBy = abjure;})();</script></html>