1 21 package proguard.obfuscate; 22 23 import proguard.classfile.*; 24 import proguard.classfile.constant.*; 25 import proguard.classfile.constant.visitor.ConstantVisitor; 26 import proguard.classfile.util.*; 27 28 35 public class ClassOpener 36 extends SimplifiedVisitor 37 implements ConstantVisitor 38 { 39 41 public void visitAnyConstant(Clazz clazz, Constant constant) {} 42 43 44 public void visitStringConstant(Clazz clazz, StringConstant stringConstant) 45 { 46 fixPackageVisibility(clazz, 47 stringConstant.referencedClass, 48 stringConstant.referencedMember); 49 } 50 51 52 public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) 53 { 54 fixPackageVisibility(clazz, 55 refConstant.referencedClass, 56 refConstant.referencedMember); 57 } 58 59 60 public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 61 { 62 Clazz referencedClass = classConstant.referencedClass; 64 if (referencedClass != null) 65 { 66 int accessFlags = referencedClass.getAccessFlags(); 67 68 if (isNotPublic(accessFlags) && 70 referencedClass instanceof ProgramClass && 71 inDifferentPackages(clazz, referencedClass)) 72 { 73 ((ProgramClass)referencedClass).u2accessFlags = 74 AccessUtil.replaceAccessFlags(accessFlags, 75 ClassConstants.INTERNAL_ACC_PUBLIC); 76 } 77 } 78 } 79 80 81 83 87 private void fixPackageVisibility(Clazz clazz, Clazz referencedClass, Member referencedMember) 88 { 89 if (referencedMember != null) 91 { 92 int accessFlags = referencedMember.getAccessFlags(); 93 94 if (isNotPublic(accessFlags) && 96 referencedMember instanceof ProgramMember && 97 inDifferentPackages(clazz, referencedClass)) 98 { 99 ((ProgramMember)referencedMember).u2accessFlags = 100 AccessUtil.replaceAccessFlags(accessFlags, 101 clazz.extends_(referencedClass) ? 102 ClassConstants.INTERNAL_ACC_PROTECTED : 103 ClassConstants.INTERNAL_ACC_PUBLIC); 104 } 105 } 106 } 107 108 109 112 private boolean inDifferentPackages(Clazz class1, Clazz class2) 113 { 114 return !ClassUtil.internalPackageName(class1.getName()).equals( 115 ClassUtil.internalPackageName(class2.getName())); 116 } 117 118 119 123 private boolean isNotPublic(int accessFlags) 124 { 125 return (accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) == 0; 126 } 127 } 128 | Popular Tags |