11
|
C. Ross trotttrotttrott · 技术社区 · 14 年前 |
![]() |
1
15
As Pete mentioned
,这可以使用ASM字节码库来完成。实际上,该库实际上附带了一个类,专门用于处理这些类名重新映射(
为了说明这一点,我创建了两个类,它们都属于默认包:
和
这是
> javap -private -c Order Compiled from "Order.java" public class Order extends java.lang.Object{ private Customer customer; public Order(Customer); Code: 0: aload_0 1: invokespecial #10; //Method java/lang/Object."":()V 4: aload_0 5: aload_1 6: putfield #13; //Field customer:LCustomer; 9: return public Customer getCustomer(); Code: 0: aload_0 1: getfield #13; //Field customer:LCustomer; 4: areturn public void setCustomer(Customer); Code: 0: aload_0 1: aload_1 2: putfield #13; //Field customer:LCustomer; 5: return }
这是
> javap -private -c Order Compiled from "Order.java" public class com.mycompany.Order extends com.mycompany.java.lang.Object{ private com.mycompany.Customer customer; public com.mycompany.Order(com.mycompany.Customer); Code: 0: aload_0 1: invokespecial #30; //Method "com.mycompany.java/lang/Object"."":()V 4: aload_0 5: aload_1 6: putfield #32; //Field customer:Lcom.mycompany.Customer; 9: return public com.mycompany.Customer getCustomer(); Code: 0: aload_0 1: getfield #32; //Field customer:Lcom.mycompany.Customer; 4: areturn public void setCustomer(com.mycompany.Customer); Code: 0: aload_0 1: aload_1 2: putfield #32; //Field customer:Lcom.mycompany.Customer; 5: return }
如你所见,重新映射已经改变了所有
这个类加载器必须加载所有的类:
|
![]() |
2
1
你应该能用 ASM 尽管在构建时而不是在加载时对包进行一次重命名会更容易。 |
![]() |
3
0
也许将API从默认包移到更合理的位置会更容易?听起来您没有访问源代码的权限。我不确定包是否被编码到类文件中,因此简单地移动API类可能值得一试。否则,像JAD这样的Java反编译程序通常会做得很好,所以您可以更改反编译源中的包名并重新编译它。 |
![]() |
Eris · 纯虚拟成员有什么优势吗(除了他们可能防止的人为错误)? 2 年前 |
![]() |
AJA SMBAT · 我在获取列表而不是绑定方法时遇到问题 2 年前 |
![]() |
KiraHoneybee · 具有构造函数参数的模板化类 2 年前 |
![]() |
amirreza870 · Python OOP-更改类文本 2 年前 |
![]() |
Rocket Procd · 获取活动类实例的数量 2 年前 |
![]() |
cred · 为什么我请求的变量在从另一个类调用时显示为0.0? 2 年前 |
![]() |
Oliver Guy · 一个类的所有实例共享相同的值 2 年前 |