Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何告诉proguard保留枚举常量和字段_Java_Proguard_Obfuscation - Fatal编程技术网

Java 如何告诉proguard保留枚举常量和字段

Java 如何告诉proguard保留枚举常量和字段,java,proguard,obfuscation,Java,Proguard,Obfuscation,我试图混淆我们的web应用程序,它使用spring、jaxb并严重依赖于注释和反射。 我应用了在互联网上找到的许多方法来保存一些类、属性、注释和枚举。 但使用枚举仍然存在问题。我可以从以下位置保留枚举常量应用配置: 乍一看,它看起来像是工作解决方案和常量,所以()返回正确的值列表。 但当我尝试通过任何名称检索字段时,我没有得到任何这样的字段异常 问题来自,请查看代码: public Field[] getEnumConstants(Class clazz) { try {

我试图混淆我们的web应用程序,它使用spring、jaxb并严重依赖于注释和反射。 我应用了在互联网上找到的许多方法来保存一些类、属性、注释和枚举。 但使用枚举仍然存在问题。我可以从以下位置保留枚举常量应用配置:

乍一看,它看起来像是工作解决方案和常量,所以()返回正确的值列表。 但当我尝试通过任何名称检索字段时,我没有得到任何这样的字段异常

问题来自,请查看代码:

public Field[] getEnumConstants(Class clazz) {
    try {
        Object[] values = clazz.getEnumConstants();
        Field[] fields = new Field[values.length];
        for (int i = 0; i < values.length; i++) {
            fields[i] = clazz.getField(((Enum) values[i]).name());
        }
        return fields;
    } catch (NoSuchFieldException e) {
        // impossible
        throw new NoSuchFieldError(e.getMessage());
    }
}
public字段[]getEnumConstants(类clazz){
试一试{
对象[]值=clazz.getEnumConstants();
字段[]字段=新字段[values.length];
对于(int i=0;i
我完全陷入了“不可能”的境地。我认为查看调试会话屏幕截图很容易理解(这里还列出了):

如果我尝试获取,它们将被模糊地列为a、b、c、d、e、f:

我的proguard配置现在看起来像(去掉一些库列表和关于proguard的kipp特定类、字段和方法):

-injars core-3.15.rc5.6.jar
-outjars core-3.15.rc5.6.proguard.jar
-libraryjars/lib/rt.jar
-图书馆罐子…#列出的其他LIB,因短缺而剔除
-printmapping core-3.15.rc5.6.proguard.map
-保留公共类ru.rlh.egais.portal.backend.controller.rest**
-保留公共类ru.rlh.egais.portal.backend.integration.soap.service**
# http://midgetontoes.com/blog/2015/06/26/tips-for-using-proguard-with-spring-framework
-优化!课程/评分/期末考试
-AdapterResourceFileContents**.properties,META-INF/MANIFEST.MF,META-INF/spring.*,spring/*
-keepattributes异常、内部类、签名、已弃用、源文件、LineNumberTable、*注释*、封闭方法
#还尝试:
#-保留广播**
-允许访问修改
-dontshrink
-dontoptimize
-dontusemixedcaseclassnames
-保留董事
-keep@org.springframework.transaction.annotation.Transactional类*
-keep@org.springframework.stereotype.Service类*
-keep@org.springframework.stereotype.Repository类*
-keep@org.springframework.stereotype.Controller类*
-keep@org.springframework.stereotype.Component类*
-keep@org.springframework.beans.factory.annotation.Autowired类*
-保留@org.springframework.web.bind.annotation.ResponseBody类*
-keep@org.springframework.web.bind.annotation.RequestMapping类*
-keep@org.springframework.stereotype.Repository类*
-keep@javax.annotation.Resource类*
-keep@org.springframework.cache.annotation.EnableCaching类*
-keep@org.springframework.context.annotation.Configuration类*
-keepclassmembers类*{
@org.springframework.beans.factory.annotation.*;
@org.springframework.beans.factory.annotation.Qualifier*;
@org.springframework.beans.factory.annotation.Value*;
@org.springframework.beans.factory.annotation.Required*;
@org.springframework.context.annotation.Bean*;
@javax.annotation.PostConstruct*;
@javax.annotation.PreDestroy*;
@org.aspectj.lang.annotation.AfterReturning*;
@org.aspectj.lang.annotation.Pointcut*;
@org.aspectj.lang.annotation.afterhrowing*;
@org.aspectj.lang.annotation.Around*;
}
-keepclassmembers枚举*{
公共静态**[]值();
公共静态**valueOf(java.lang.String);
}
那么,我的问题是,如何才能完全避免公共枚举混淆?在这两种情况下-使用其常量()和字段()。

感谢我找到了问题的解决方案(必须添加):

-keepclassmembers类*扩展java.lang.Enum{
;
公共静态**[]值();
公共静态**valueOf(java.lang.String);
}

这对我来说很有效

-keep public enum com.company.appname.**{
    *;
}

其中**是包和子包。

对于任何遇到此问题并希望获得ant等价物的人:添加到您的proguard任务。我想您是在谈论
maven
任务配置吗?在最初的问题中没有关于maven的任何内容。我使用了
gradle
,但它也超出了范围。因此,答案中提供的所有配置都属于
proguard.conf
syntax.Hubbitus是的,但是我发现这个答案是第三个链接,当时我正试图解决这个问题,但使用ant(不是maven),而不是直接使用proguard。这两者之间的翻译不是很明显,至少对我来说不是这样,所以我添加了一条评论,以便在我的情况下发现这一点的任何其他人也能获得额外的信息。这绝不意味着你的回答不正确或不完整。如果这是你的推断,我很遗憾。另见对于Android项目,可以通过参考build.gradle中的proguard-Android.txt加载这些设置。
-injars  core-3.15.rc5.6.jar
-outjars core-3.15.rc5.6.proguard.jar

-libraryjars <java.home>/lib/rt.jar

-libraryjars ... # Other libs listed, strip out for shortness

-printmapping core-3.15.rc5.6.proguard.map

-keep public class ru.rlh.egais.portal.backend.controller.rest.**
-keep public class ru.rlh.egais.portal.backend.integration.soap.service.**

# http://midgetontoes.com/blog/2015/06/26/tips-for-using-proguard-with-spring-framework
-optimizations !class/marking/final

-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF,META-INF/spring.*,spring/*

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# Also tried:
# -keepattributes **

-allowaccessmodification
-dontshrink
-dontoptimize
-dontusemixedcaseclassnames
-keepdirectories
-keep @org.springframework.transaction.annotation.Transactional class *
-keep @org.springframework.stereotype.Service class *
-keep @org.springframework.stereotype.Repository class *
-keep @org.springframework.stereotype.Controller class *
-keep @org.springframework.stereotype.Component class *
-keep @org.springframework.beans.factory.annotation.Autowired class *
-keep @org.springframework.web.bind.annotation.ResponseBody class *
-keep @org.springframework.web.bind.annotation.RequestMapping class *
-keep @org.springframework.stereotype.Repository class *
-keep @javax.annotation.Resource class *
-keep @org.springframework.cache.annotation.EnableCaching class *
-keep @org.springframework.context.annotation.Configuration class *

-keepclassmembers class * {
    @org.springframework.beans.factory.annotation.* *;
    @org.springframework.beans.factory.annotation.Qualifier *;
    @org.springframework.beans.factory.annotation.Value *;
    @org.springframework.beans.factory.annotation.Required *;
    @org.springframework.context.annotation.Bean *;
    @javax.annotation.PostConstruct *;
    @javax.annotation.PreDestroy *;
    @org.aspectj.lang.annotation.AfterReturning *;
    @org.aspectj.lang.annotation.Pointcut *;
    @org.aspectj.lang.annotation.AfterThrowing *;
    @org.aspectj.lang.annotation.Around *;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keepclassmembers class * extends java.lang.Enum {
    <fields>;
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep public enum com.company.appname.**{
    *;
}