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>