]
Shigeru Chiba resolved JASSIST-119.
-----------------------------------
Fix Version/s: 3.13.0.GA
Resolution: Done
CtClass should have getField(String name, String desc)
------------------------------------------------------
Key: JASSIST-119
URL:
https://jira.jboss.org/browse/JASSIST-119
Project: Javassist
Issue Type: Feature Request
Affects Versions: 3.12.0.GA
Reporter: Yu Kobayashi
Assignee: Shigeru Chiba
Fix For: 3.13.0.GA
Java language does not allow to have same name fields in a class like this.
class TestClass {
int a;
long a;
}
However, this is allowed in a Java class file, and actually some obfuscator using this.
Therefore, CtClass and its subclass should have getField(String name, String desc).
Please add these to CtClass.java and preserve original getField(String name).
public CtField getField(String name, String desc) throws NotFoundException {
throw new NotFoundException(name + " " + desc);
}
CtField getField2(String name, String desc) { return null; }
public CtField getDeclaredField(String name, String desc) throws NotFoundException {
throw new NotFoundException(name + " " + desc);
}
Also please add this to CtClassType.java, and remove original getField, getField2,
getDeclaredField, and getDeclaredField2.
public CtField getField(String name) throws NotFoundException {
return getField(name, null);
}
public CtField getField(String name, String desc) throws NotFoundException {
CtField f = getField2(name, desc);
if (f == null)
throw new NotFoundException("field: " + name + " in " +
getName());
else
return f;
}
CtField getField2(String name, String desc) {
CtField df = getDeclaredField2(name, desc);
if (df != null)
return df;
try {
CtClass[] ifs = getInterfaces();
int num = ifs.length;
for (int i = 0; i < num; ++i) {
CtField f = ifs[i].getField2(name, desc);
if (f != null)
return f;
}
CtClass s = getSuperclass();
if (s != null)
return s.getField2(name, desc);
}
catch (NotFoundException e) {}
return null;
}
public CtField getDeclaredField(String name) throws NotFoundException {
return getDeclaredField(name, null);
}
public CtField getDeclaredField(String name, String desc) throws NotFoundException {
CtField f = getDeclaredField2(name, desc);
if (f == null)
throw new NotFoundException("field: " + name + " in " +
getName());
else
return f;
}
private CtField getDeclaredField2(String name, String desc) {
CtMember.Cache memCache = getMembers();
CtMember field = memCache.fieldHead();
CtMember tail = memCache.lastField();
while (field != tail) {
field = field.next();
if (field.getName().equals(name) && (desc == null ||
desc.equals(field.getSignature())))
return (CtField)field;
}
return null;
}
Sorry for these are not a diff file and copy and paste from my source files.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: