Javaassists和JavaWebStart:class sign不';与其他类别不匹配的符号是同一个包

Javaassists和JavaWebStart:class sign不';与其他类别不匹配的符号是同一个包,java,securityexception,javassist,Java,Securityexception,Javassist,我正在使用javaassists在运行时修改类的行为。当我在电脑上运行应用程序时,一切正常 但该应用程序是由使用JavaWebStart的用户启动的,因此必须对该应用程序的.jar进行签名。当javaassists在运行时修改类并使用 CtClass.toClass() 方法启动SecurityException: java.lang.SecurityException: class "com.sch.coberturas.db.CobDao"'s signer information do

我正在使用javaassists在运行时修改类的行为。当我在电脑上运行应用程序时,一切正常

但该应用程序是由使用JavaWebStart的用户启动的,因此必须对该应用程序的.jar进行签名。当javaassists在运行时修改类并使用

CtClass.toClass() 
方法启动SecurityException:

java.lang.SecurityException: class "com.sch.coberturas.db.CobDao"'s signer information does not match signer information of other classes in the same package

我可以通过在单个类包中隔离修改过的类来避免这种情况,但这是一个奇怪的解决方案。还有其他工作吗?

像OP请求的那样,我正在就我的评论创建一个答案

使用SecurityManager时,必须始终提供正在使用的受保护域。有了这些信息,javassist将能够生成具有相同签名信息的类

这意味着不应使用
CtClass.toClass()
而应使用
ClassPool.toClass(CtClass-ct、java.lang.ClassLoader、java.security.ProtectionDomain)


我想在javassist中添加更多关于此方法的信息,如果您正在更改的类在其所属的包中有更多的类,那么它也可能引发签名者信息异常。 我通过加载它们并将它们添加到我更改类的同一位置来修复它

示例

ClassPool pool = ClassPool.getDefault();
pool.insertClassPath( new ClassClassPath( this.getClass() ));
ClassLoader loader = this.getClass().getClassLoader();
ProtectionDomain domain = this.getClass().getProtectionDomain();
CtClass class = pool.get("package1.myChangingClass");
// Here goes the code to change the class;
pool.toClass( class, loader, domain );
//
// Now insert code to pre-load other classes with same domain
CtClass otherClass1 = pool.get("package1.someOtherClass1"); // Gets
pool.toClass( otherClass1, loader, domain );                // Preloads
...
CtClass otherClassN = pool.get("package1.someOtherClassN");
pool.toClass( otherClassN, loader, domain );
//
// To be done for all other classes of the same package that throws
// the signer's information exception, after package1.myChangingClass
// is modified and built.

亲切问候。

可能重复“否”,所有类都由同一证书签名,否则应用程序将不会由Java Web start启动。问题是因为javaassists在运行时修改类,使符号在运行时无效(幸运的是,java web start的符号verificación在应用程序启动之前),并且与同一包中其他类的符号不匹配。如果不使用
CtClass.toClass()怎么办
您使用
ClassPool.toClass(CtClass-ct,java.lang.ClassLoader,java.security.ProtectionDomain))
为保护域提供原始的类保护域?通过这种方式,生成的类应该使用与原始类(检查javadoc:,java.lang.ClassLoader,java.security.ProtectionDomain)相同的信息进行签名。你能把它贴在一个答案里,这样我就可以把它标记为解决方案吗?@Telcontar:很高兴我能帮上忙,我添加了答案,这样你就可以接受了