#!/bin/bash
##################################################################################
# #
# universalJavaApplicationStub #
# #
# A BASH based JavaApplicationStub for Java Apps on Mac OS X #
# that works with both Apple's and Oracle's plist format. #
# #
# Inspired by Ian Roberts stackoverflow answer #
# at http://stackoverflow.com/a/17546508/1128689 #
# #
# @author Tobias Fischer #
# @url https://github.com/tofi86/universalJavaApplicationStub #
# @date 2023-02-04 #
# @version 3.3.0 #
# #
##################################################################################
# #
# The MIT License (MIT) #
# #
# Copyright (c) 2014-2023 Tobias Fischer #
# #
# Permission is hereby granted, free of charge, to any person obtaining a copy #
# of this software and associated documentation files (the "Software"), to deal #
# in the Software without restriction, including without limitation the rights #
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #
# copies of the Software, and to permit persons to whom the Software is #
# furnished to do so, subject to the following conditions: #
# #
# The above copyright notice and this permission notice shall be included in all #
# copies or substantial portions of the Software. #
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE #
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, #
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE #
# SOFTWARE. #
# #
##################################################################################
# function 'stub_logger()'
#
# A logger which logs to the macOS Console.app using the 'syslog' command
#
# @param1 the log message
# @return void
################################################################################
function stub_logger() {
syslog -s -k \
Facility com.apple.console \
Level Notice \
Sender "$(basename "$0")" \
Message "[$$][${CFBundleName:-$(basename "$0")}] $1"
}
# set the directory abspath of the current
# shell script with symlinks being resolved
############################################
PRG=$0
while [ -h "$PRG" ]; do
ls=$(ls -ld "$PRG")
link=$(expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null)
if expr "$link" : '^/' 2> /dev/null >/dev/null; then
PRG="$link"
else
PRG="$(dirname "$PRG")/$link"
fi
done
PROGDIR=$(dirname "$PRG")
stub_logger "[StubDir] $PROGDIR"
# set files and folders
############################################
# the absolute path of the app package
cd "$PROGDIR"/../../ || exit 11
AppPackageFolder=$(pwd)
# the base path of the app package
cd .. || exit 12
AppPackageRoot=$(pwd)
# set Apple's Java folder
AppleJavaFolder="${AppPackageFolder}"/Contents/Resources/Java
# set Apple's Resources folder
AppleResourcesFolder="${AppPackageFolder}"/Contents/Resources
# set Oracle's Java folder
OracleJavaFolder="${AppPackageFolder}"/Contents/Java
# set Oracle's Resources folder
OracleResourcesFolder="${AppPackageFolder}"/Contents/Resources
# set path to Info.plist in bundle
InfoPlistFile="${AppPackageFolder}"/Contents/Info.plist
# set the default JVM Version to a null string
JVMVersion=""
JVMMaxVersion=""
# function 'plist_get()'
#
# read a specific Plist key with 'PlistBuddy' utility
#
# @param1 the Plist key with leading colon ':'
# @return the value as String or Array
################################################################################
plist_get(){
/usr/libexec/PlistBuddy -c "print $1" "${InfoPlistFile}" 2> /dev/null
}
# function 'plist_get_java()'
#
# read a specific Plist key with 'PlistBuddy' utility
# in the 'Java' or 'JavaX' dictionary (<dict>)
#
# @param1 the Plist :Java(X):Key with leading colon ':'
# @return the value as String or Array
################################################################################
plist_get_java(){
plist_get ${JavaKey:-":Java"}$1
}
# read Info.plist and extract JVM options
############################################
# read the program name from CFBundleName
CFBundleName=$(plist_get ':CFBundleName')
# read the icon file name
CFBundleIconFile=$(plist_get ':CFBundleIconFile')
# check Info.plist for Apple style Java keys -> if key :Java is present, parse in apple mode
/usr/libexec/PlistBuddy -c "print :Java" "${InfoPlistFile}" > /dev/null 2>&1
exitcode=$?
JavaKey=":Java"
# if no :Java key is present, check Info.plist for universalJavaApplication style JavaX keys -> if key :JavaX is present, parse in apple mode
if [ $exitcode -ne 0 ]; then
/usr/libexec/PlistBuddy -c "print :JavaX" "${InfoPlistFile}" > /dev/null 2>&1
exitcode=$?
JavaKey=":JavaX"
fi
# read 'Info.plist' file in Apple style if exit code returns 0 (true, ':Java' key is present)
if [ $exitcode -eq 0 ]; then
stub_logger "[PlistStyle] Apple"
# set Java and Resources folder
JavaFolder="${AppleJavaFolder}"
ResourcesFolder="${AppleResourcesFolder}"
# set expandable variables
APP_ROOT="${AppPackageFolder}"
APP_PACKAGE="${AppPackageFolder}"
JAVAROOT="${AppleJavaFolder}"
USER_HOME="$HOME"
# read the Java WorkingDirectory
JVMWorkDir=$(plist_get_java ':WorkingDirectory' | xargs)
# set Working Directory based upon PList value
if [[ ! -z ${JVMWorkDir} ]]; then
WorkingDirectory="${JVMWorkDir}"
else
# AppPackageRoot is the standard WorkingDirectory when the script is started
WorkingDirectory="${AppPackageRoot}"
fi
# expand variables $APP_PACKAGE, $APP_ROOT, $JAVAROOT, $USER_HOME
WorkingDirectory=$(eval echo "${WorkingDirectory}")
# read the MainClass name
JVMMainClass="$(plist_get_java ':MainClass')"
# read the SplashFile name
JVMSplashFile=$(plist_get_java ':SplashFile')
# read the JVM Properties as an array and retain spaces
IFS=$'\t\n'
JVMOptions=($(xargs -n1 <<<$(plist_get_java ':Properties' | grep " =" | sed 's/^ */-D/g' | sed -E 's/ = (.*)$/="\1"/g')))
unset IFS
# post processing of the array follows further below...
# read the ClassPath in either Array or String style
JVMClassPath_RAW=$(plist_get_java ':ClassPath' | xargs)
if [[ $JVMClassPath_RAW == *Array* ]] ; then
JVMClassPath=.$(plist_get_java ':ClassPath' | grep " " | sed 's/^ */:/g' | tr -d '\n' | xargs)
else
JVMClassPath=${JVMClassPath_RAW}
fi
# expand variables $APP_PACKAGE, $APP
Java反编译是将已编译的Java字节码转换回源代码的过程,这对于理解类库的工作原理、学习代码实现或者在没有源代码的情况下调试二进制程序非常有用。JD-GUI是一款流行的Java反编译工具,尤其适用于Mac用户。在本文中,我们将深入探讨JD-GUI在Mac平台上的使用,以及它如何帮助开发者处理Java字节码。 JD-GUI是一款图形用户界面工具,它允许开发者直接查看和分析单个Java类文件的源代码,而无需进行复杂的命令行操作。这款工具由Jikes项目开发团队维护,提供了直观的界面,能够快速打开、浏览和搜索类文件的反编译源代码。 1. **安装JD-GUI on Mac**: 你需要下载JD-GUI的Mac版本,通常以.dmg文件形式提供。下载完成后,双击.dmg文件,拖动JD-GUI图标到“应用程序”文件夹,完成安装。 2. **使用JD-GUI**: 打开JD-GUI应用,你会看到一个简洁的界面,包括源代码编辑器和类文件浏览器。你可以通过点击界面上的"Open Class File"按钮,选择需要反编译的`.class`文件。JD-GUI会自动反编译并显示源代码。 3. **反编译过程**: JD-GUI使用了自己的反编译引擎,能尽可能地恢复原始的Java源代码结构,包括类、方法、变量等。虽然它可能无法完全恢复注释和原始变量名(因为这些信息在编译后通常会被丢弃),但大多数逻辑结构和函数调用都能被正确地展现出来。 4. **特性与优势**: JD-GUI支持快速定位,你可以通过搜索功能迅速找到类或方法。此外,它可以高亮显示代码,便于阅读和理解。JD-GUI还支持查看类的继承关系,这对于理解和调试复杂的Java项目特别有帮助。 5. **与其他反编译工具的比较**: 虽然JD-GUI是一个强大的工具,但它并不是唯一的选择。例如,JAD是另一款知名的Java反编译器,提供命令行界面,适合自动化脚本。Procyon和FernFlower也是常见的替代品,各有其特点和优势。然而,对于寻求简单易用界面的Mac用户,JD-GUI往往是最优选。 6. **注意事项**: 反编译他人的代码可能存在法律风险,尤其是在没有获得授权的情况下。在使用JD-GUI或其他反编译工具时,确保你有权访问并使用目标代码,遵守软件许可协议。 7. **实践应用**: JD-GUI常用于逆向工程,帮助开发者了解第三方库的内部工作,以便于自定义、扩展或修复问题。此外,它也可用于教学目的,让学生在没有源代码的情况下学习已有的Java程序。 JD-GUI为Mac用户提供了方便快捷的Java反编译体验,通过可视化界面,使得分析Java字节码变得更加容易。尽管它可能无法恢复所有原始源代码细节,但对于开发者来说,它无疑是一个强大的辅助工具。





















- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 4
- 资源: 5
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- Java毕业设计-基于springboot+vue的学生信息管理系统源码
- Tableau的每日营收数据分析
- 电力系统中级联H桥STATCOM与SVG的不平衡电网控制及电压跌落解决方案
- 基于springcloud+vue的学校考勤管理系统源码(Java毕业设计)
- Spring AI MCP服务开发使用测试源码
- 电力电子中角形级联H桥STATCOM的负序抑制与APD技术优化
- Java基于SSM房屋租赁管理系统源码+数据库+文档(Java毕业设计)
- Java基于SSM的房屋出租 出售管理系统前后端源码
- 基于Spring Boot的驾校课程预约管理系统的设计与实现源码(Java毕业设计)
- 电力电子领域中角形级联H桥STATCOM的负序抑制与分相控制策略
- MATLAB图像处理实验平台:从基础读图到高级形态学处理的全面指南
- 基于Springboot+vue2构建驾校报名管理系统源码+数据库(Java毕业设计)
- 西门子1500 PLC Profinet总线控制9台V90伺服系统的SCL编程与应用
- 基于SpringBoot+Mysql的驾校预约管理系统源码+数据库(Java毕业设计)
- 基于西门子1200PLC的六层双梯群控电梯仿真系统设计与实现
- Java实现的驾校预约管理系统前后端(源码+数据库+文档) 毕业设计


