11
|
C. Ross trotttrotttrott · 技术社区 · 15 年前 |
![]() |
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反编译程序通常会做得很好,所以您可以更改反编译源中的包名并重新编译它。 |
![]() |
iasonas · 如何检查自定义注释? 4 月前 |
![]() |
Svyat · 如何创建一个类设置,其中两个类各包含另一个类的实例? 5 月前 |
![]() |
F-22 Destroyer · 遇到super()问题 9 月前 |
|
simply lemon · python上链表的添加方法 10 月前 |
![]() |
Minty · 自定义类中使用numpy数组进行左加法/右加法的不同行为 10 月前 |