HHH-13343 : Bytecode enhancement using ByteBuddy fails when the class is not available from the provided ClassLoader
This commit is contained in:
parent
de09e67872
commit
75b25a4e4c
|
@ -14,7 +14,6 @@ import java.lang.reflect.Modifier;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
@ -126,7 +125,7 @@ public class EnhancerImpl implements Enhancer {
|
||||||
public synchronized byte[] enhance(String className, byte[] originalBytes) throws EnhancementException {
|
public synchronized byte[] enhance(String className, byte[] originalBytes) throws EnhancementException {
|
||||||
//Classpool#describe does not accept '/' in the description name as it expects a class name. See HHH-12545
|
//Classpool#describe does not accept '/' in the description name as it expects a class name. See HHH-12545
|
||||||
final String safeClassName = className.replace( '/', '.' );
|
final String safeClassName = className.replace( '/', '.' );
|
||||||
classFileLocator.addNameAndBytes( safeClassName, originalBytes );
|
classFileLocator.setClassNameAndBytes( safeClassName, originalBytes );
|
||||||
try {
|
try {
|
||||||
final TypeDescription typeDescription = typePool.describe( safeClassName ).resolve();
|
final TypeDescription typeDescription = typePool.describe( safeClassName ).resolve();
|
||||||
|
|
||||||
|
@ -539,7 +538,10 @@ public class EnhancerImpl implements Enhancer {
|
||||||
|
|
||||||
private class EnhancerClassFileLocator extends ClassFileLocator.ForClassLoader {
|
private class EnhancerClassFileLocator extends ClassFileLocator.ForClassLoader {
|
||||||
|
|
||||||
private Map<String,Resolution> nameToResolutionMap = new HashMap<>();
|
// The name of the class to (possibly be) transformed.
|
||||||
|
private String className;
|
||||||
|
// The explicitly resolved Resolution for the class to (possibly be) transformed.
|
||||||
|
private Resolution resolution;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new class file locator for the given class loader.
|
* Creates a new class file locator for the given class loader.
|
||||||
|
@ -551,20 +553,21 @@ public class EnhancerImpl implements Enhancer {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Resolution locate(String name) throws IOException {
|
public Resolution locate(String className) throws IOException {
|
||||||
Resolution resolution = nameToResolutionMap.get( name );
|
assert className != null;
|
||||||
if ( resolution != null ) {
|
if ( className.equals( this.className ) ) {
|
||||||
return resolution;
|
return resolution;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return super.locate( name );
|
return super.locate( className );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void addNameAndBytes(String name, byte[] bytes ) {
|
void setClassNameAndBytes(String className, byte[] bytes) {
|
||||||
assert name != null;
|
assert className != null;
|
||||||
assert bytes != null;
|
assert bytes != null;
|
||||||
nameToResolutionMap.put( name, new Resolution.Explicit( bytes) );
|
this.className = className;
|
||||||
|
this.resolution = new Resolution.Explicit( bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue