Java 类java.lang.instrument.IllegalClassFormatException 实例源码
项目:incubator-netbeans
文件:NbInstrumentation.java
public static byte[] patchByteCode(ClassLoader l, String className, ProtectionDomain pd, byte[] arr) throws IllegalClassFormatException {
if (ACTIVE == null) {
return arr;
}
if (Boolean.TRUE.equals(IN.get())) {
return arr;
}
try {
IN.set(Boolean.TRUE);
for (NbInstrumentation inst : ACTIVE) {
for (ClassFileTransformer t : inst.transformers) {
arr = t.transform(l, className, null, pd, arr);
}
}
} finally {
IN.set(null);
}
return arr;
}
项目:incubator-netbeans
文件:HelloWorldAgent.java
@Override
public byte[] transform(
ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] arr
) throws IllegalClassFormatException {
byte[] ret = arr;
for (int i = 0; i < arr.length - 4; i++) {
if (arr[i] == 'H' && arr[i + 1] == 'e' && arr[i + 2] == 'l' &&
arr[i + 3] == 'o'
) {
ret = ret.clone();
ret[i] = 'A';
ret[i + 1] = 'h';
ret[i + 2] = 'o';
ret[i + 3] = 'j';
}
}
return ret;
}
项目:incubator-netbeans
文件:HelloWorldAgent.java
@Override
public byte[] transform(
ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] arr
) throws IllegalClassFormatException {
byte[] ret = arr;
for (int i = 0; i < arr.length - 4; i++) {
if (arr[i] == 'H' && arr[i + 1] == 'e' && arr[i + 2] == 'l' &&
arr[i + 3] == 'o'
) {
ret = ret.clone();
ret[i] = 'A';
ret[i + 1] = 'h';
ret[i + 2] = 'o';
ret[i + 3] = 'j';
}
}
return ret;
}
项目:otus_java_2017_06
文件:MyClassTransformer.java
public byte[] transform(ClassLoader loader,
String className,
Class classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
try {
pool.insertClassPath(new ByteArrayClassPath(className, classfileBuffer));
CtClass cclass = pool.get(className.replaceAll("/", "."));
if (!cclass.getName().startsWith("ru.otus.")) {
return null; // the same as return classfileBuffer; without changes
}
for (CtMethod currentMethod : cclass.getDeclaredMethods()) {
AddLog annotation = (AddLog) currentMethod.getAnnotation(AddLog.class);
if (annotation != null) {
currentMethod.insertBefore("{System.out.println(\"" + annotation.message() + "\");}");
}
}
return cclass.toBytecode();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
项目:byte-chameleon
文件:Transformer.java
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
String classNameFinal = className.replace('/', '.');
byte[] retorno = classfileBuffer;
ClassPool cp = ClassPool.getDefault();
cp.appendClassPath(new LoaderClassPath(loader));
Iterator<String> iterator = this.mapClasse.keySet().iterator();
while (iterator.hasNext()) {
String classNameParam = iterator.next();
if (classNameFinal.equals(classNameParam)) {
Clazz classe = this.mapClasse.get(classNameFinal);
this.mapClasse.remove(classNameParam);
return instrumentalize(cp, classNameFinal, retorno, classe);
}
}
return retorno;
}
项目:lams
文件:WeavingTransformer.java
/**
* Apply transformation on a given class byte definition.
* The method will always return a non-null byte array (if no transformation has taken place
* the array content will be identical to the original one).
* @param className the full qualified name of the class in dot format (i.e. some.package.SomeClass)
* @param internalName class name internal name in / format (i.e. some/package/SomeClass)
* @param bytes class byte definition
* @param pd protection domain to be used (can be null)
* @return (possibly transformed) class byte definition
*/
public byte[] transformIfNecessary(String className, String internalName, byte[] bytes, ProtectionDomain pd) {
byte[] result = bytes;
for (ClassFileTransformer cft : this.transformers) {
try {
byte[] transformed = cft.transform(this.classLoader, internalName, null, pd, result);
if (transformed != null) {
result = transformed;
}
}
catch (IllegalClassFormatException ex) {
throw new IllegalStateException("Class file transformation failed", ex);
}
}
return result;
}
项目:otus_java_2017_04
文件:MyClassTransformer.java
public byte[] transform(ClassLoader loader,
String className,
Class classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
try {
pool.insertClassPath(new ByteArrayClassPath(className, classfileBuffer));
CtClass cclass = pool.get(className.replaceAll("/", "."));
if (!cclass.getName().startsWith("ru.otus.")) {
return null; // the same as return classfileBuffer; without changes
}
for (CtMethod currentMethod : cclass.getDeclaredMethods()) {
AddLog annotation = (AddLog) currentMethod.getAnnotation(AddLog.class);
if (annotation != null) {
currentMethod.insertBefore("{System.out.println(\"" + annotation.message() + "\");}");
}
}
return cclass.toBytecode();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
项目:SoftUni
文件:Main.java
public static void main(String[] args) throws IllegalClassFormatException {
Scanner scanner = new Scanner(System.in);
String driverName = scanner.nextLine();
Car ferrari = new Ferrari(driverName);
System.out.println(ferrari);
String ferrariName = Ferrari.class.getSimpleName();
String carInterface = Car.class.getSimpleName();
boolean isCreated = Car.class.isInterface();
if (!isCreated) {
throw new IllegalClassFormatException("No interface created!");
}
}
项目:openjdk-jdk10
文件:RedefineAnnotations.java
@Override public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException {
if (className.contains("TypeAnnotatedTestClass")) {
try {
// Here we remove and re-add the dummy fields. This shuffles the constant pool
return asm(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
} catch (Throwable e) {
// The retransform native code that called this method does not propagate
// exceptions. Instead of getting an uninformative generic error, catch
// problems here and print it, then exit.
e.printStackTrace();
System.exit(1);
}
}
return null;
}
项目:otus_java_2017_10
文件:SleepTransformer.java
public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
byte[] byteCode = classfileBuffer;
if (className.equals("beans/Sleeping")) {
try {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("beans.Sleeping");
CtMethod m = cc.getDeclaredMethod("sleepNow");
m.addLocalVariable("elapsedTime", CtClass.longType);
m.insertBefore("elapsedTime = System.currentTimeMillis();");
m.insertAfter("{elapsedTime = System.currentTimeMillis() - elapsedTime;"
+ "System.out.println(\"Method Executed in ms: \" + elapsedTime);}");
byteCode = cc.toBytecode();
cc.detach();
} catch (Exception ex) {
ex.printStackTrace();
}
}
return byteCode;
}
项目:java-performance
文件:ClassTransformer.java
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain pd, byte[] byteCode) throws IllegalClassFormatException {
if (className.replace("/", ".").equals(clazzName)) {
System.out.println("Agent: instrumenting " + className);
try {
ClassPool classPool = ClassPool.getDefault();
CtClass clazz = classPool.get(clazzName);
addTiming(clazz, method);
byte[] instrumentedByteCode = clazz.toBytecode();
clazz.detach();
saveByteCode(instrumentedByteCode, clazz.getSimpleName());
System.out.println("Agent: instrumented successfully " + clazzName + "." + method);
return instrumentedByteCode;
} catch (Throwable t) {
t.printStackTrace();
}
}
return byteCode;
}
项目:authlib-injector
文件:TweakerTransformerAdapter.java
@Override
public byte[] transform(String name, String transformedName, byte[] classBuffer) {
String internalClassName = name.replace('.', '/');
for (ClassFileTransformer transformer : AuthlibInjectorTweaker.transformers) {
byte[] result = null;
try {
result = transformer.transform(Launch.classLoader, internalClassName, null, null, classBuffer);
} catch (IllegalClassFormatException e) {
log("exception while invoking {0}: {1}", transformer, e);
e.printStackTrace();
}
if (result != null) {
classBuffer = result;
}
}
return classBuffer;
}
项目:authlib-injector
文件:ClassTransformer.java
@Override
public byte[] transform(ClassLoader loader, String internalClassName, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if (internalClassName != null && classfileBuffer != null) {
try {
String className = internalClassName.replace('/', '.');
for (String prefix : ignores)
if (className.startsWith(prefix)) return null;
TransformHandle handle = new TransformHandle(className, classfileBuffer);
units.forEach(handle::accept);
if (handle.getResult().isPresent()) {
byte[] classBuffer = handle.getResult().get();
if (debug) {
saveClassFile(className, classBuffer);
}
return classBuffer;
} else {
return null;
}
} catch (Throwable e) {
log("unable to transform {0}: {1}", internalClassName, e);
e.printStackTrace();
}
}
return null;
}
项目:fastAOP
文件:CatchBlockClassTransformer.java
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if(className.startsWith(TransformConfig.getInstance().getPackageScan())) {
logger.log(Level.INFO, "-------------------CLASS---------------------");
logger.log(Level.INFO, "className: " + className);
ClassReader cr = new ClassReader(classfileBuffer);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
ClassVisitor classVisitor = new HookClassAdapter(Opcodes.ASM5, cw);
cr.accept(classVisitor, ClassReader.SKIP_FRAMES);
// try {
// FileOutputStream fos = new FileOutputStream(new File("classMod.class"));
// fos.write(cw.toByteArray());
// fos.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
return cw.toByteArray();
}
return null;
}
项目:openjdk9
文件:RedefineAnnotations.java
@Override public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException {
if (className.contains("TypeAnnotatedTestClass")) {
try {
// Here we remove and re-add the dummy fields. This shuffles the constant pool
return asm(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
} catch (Throwable e) {
// The retransform native code that called this method does not propagate
// exceptions. Instead of getting an uninformative generic error, catch
// problems here and print it, then exit.
e.printStackTrace();
System.exit(1);
}
}
return null;
}
项目:spring4-understanding
文件:WeavingTransformer.java
/**
* Apply transformation on a given class byte definition.
* The method will always return a non-null byte array (if no transformation has taken place
* the array content will be identical to the original one).
* @param className the full qualified name of the class in dot format (i.e. some.package.SomeClass)
* @param internalName class name internal name in / format (i.e. some/package/SomeClass)
* @param bytes class byte definition
* @param pd protection domain to be used (can be null)
* @return (possibly transformed) class byte definition
*/
public byte[] transformIfNecessary(String className, String internalName, byte[] bytes, ProtectionDomain pd) {
byte[] result = bytes;
for (ClassFileTransformer cft : this.transformers) {
try {
byte[] transformed = cft.transform(this.classLoader, internalName, null, pd, result);
if (transformed != null) {
result = transformed;
}
}
catch (IllegalClassFormatException ex) {
throw new IllegalStateException("Class file transformation failed", ex);
}
}
return result;
}
项目:spring4-understanding
文件:WeavingTransformer.java
/**
* Apply transformation on a given class byte definition.
* The method will always return a non-null byte array (if no transformation has taken place
* the array content will be identical to the original one).
* @param className the full qualified name of the class in dot format (i.e. some.package.SomeClass)
* @param internalName class name internal name in / format (i.e. some/package/SomeClass)
* @param bytes class byte definition
* @param pd protection domain to be used (can be null)
* @return (possibly transformed) class byte definition
*/
public byte[] transformIfNecessary(String className, String internalName, byte[] bytes, ProtectionDomain pd) {
byte[] result = bytes;
for (ClassFileTransformer cft : this.transformers) {
try {
byte[] transformed = cft.transform(this.classLoader, internalName, null, pd, result);
if (transformed != null) {
result = transformed;
}
}
catch (IllegalClassFormatException ex) {
throw new IllegalStateException("Class file transformation failed", ex);
}
}
return result;
}
项目:my-spring-cache-redis
文件:WeavingTransformer.java
/**
* Apply transformation on a given class byte definition.
* The method will always return a non-null byte array (if no transformation has taken place
* the array content will be identical to the original one).
* @param className the full qualified name of the class in dot format (i.e. some.package.SomeClass)
* @param internalName class name internal name in / format (i.e. some/package/SomeClass)
* @param bytes class byte definition
* @param pd protection domain to be used (can be null)
* @return (possibly transformed) class byte definition
*/
public byte[] transformIfNecessary(String className, String internalName, byte[] bytes, ProtectionDomain pd) {
byte[] result = bytes;
for (ClassFileTransformer cft : this.transformers) {
try {
byte[] transformed = cft.transform(this.classLoader, internalName, null, pd, result);
if (transformed != null) {
result = transformed;
}
}
catch (IllegalClassFormatException ex) {
throw new IllegalStateException("Class file transformation failed", ex);
}
}
return result;
}
项目:MojangBlacklistBypass
文件:BypassAgent.java
/**
* Transformation method - implemented by a ClassFileTransformer in order to change classes' bytecode as they are loaded.
* @param classLoader The ClassLoader of the class being transformed.
* @param className The class name passed from the JVM.
* @param classBeingTransformed The Class object of the class being transformed.
* @param protectionDomain The protection domain of the class being transformed.
* @param bytes The bytecode of the class being transformed.
* @return The redefined array of bytes.
* @throws IllegalClassFormatException
*/
@Override
public byte[] transform(ClassLoader classLoader, String className, Class<?> classBeingTransformed, ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException {
try {
if (className != null) {
className = className.replace("/", ".");
if (className.equals("io.netty.bootstrap.Bootstrap")) {
ClassPool pool = ClassPool.getDefault();
pool.appendClassPath(new ByteArrayClassPath(className, bytes));
CtClass ctClass = pool.get(className);
CtMethod method = ctClass.getMethod("isBlockedServerHostName", "(Ljava/lang/String;)Z");
method.setBody("{ return false; }");
System.out.println("[MojangBlacklistBypass] Successfully retransformed server blacklist!");
return ctClass.toBytecode();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
项目:continuations
文件:JavaAgent.java
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if(MethodDatabase.isJavaCore(className)) {
return null;
}
if(className.startsWith("org/objectweb/asm/")) {
return null;
}
db.log(LogLevel.INFO, "TRANSFORM: %s", className);
try {
return instrumentClass(db, classfileBuffer, check);
} catch(Exception ex) {
db.error("Unable to instrument", ex);
return null;
}
}
项目:jagent
文件:MethodDeleterTransformer.java
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> clazz, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
if (!classNameToProcess.equals(className))
return null;
ClassReader cr = new ClassReader(classfileBuffer);
ClassInfoVisitor ciVisitor = new ClassInfoVisitor();
cr.accept(ciVisitor, 0);
ClassInfo cInfo = ciVisitor.buildClassInfo();
ciCache.getOrInitClassInfoMap(loader).put(className, cInfo);
ClassWriter cw = new FrameClassWriter(loader, ciCache, cInfo.getVersion());
ClassVisitor transformer = new ClassVisitor(ASM_API, cw) {
@Override
public MethodVisitor visitMethod(int access, final String mname, final String desc, String signature, String[] exceptions) {
if (methodToDelete.equals(mname))
return null;
return super.visitMethod(access, mname, desc, signature, exceptions);
}
};
cr.accept(transformer, 0);
return cw.toByteArray();
}
项目:lookaside_java-1.8.0-openjdk
文件:RedefineAnnotations.java
@Override public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException {
if (className.contains("TypeAnnotatedTestClass")) {
try {
// Here we remove and re-add the dummy fields. This shuffles the constant pool
return asm(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
} catch (Throwable e) {
// The retransform native code that called this method does not propagate
// exceptions. Instead of getting an uninformative generic error, catch
// problems here and print it, then exit.
e.printStackTrace();
System.exit(1);
}
}
return null;
}
项目:dynamic-sequence-diagrams
文件:MethodTrackingTransformer.java
@Override
public byte[] transform(ClassLoader loader, String className, Class clazz, ProtectionDomain domain, byte[] originalBytes) throws IllegalClassFormatException {
if (!className.startsWith(packagePrefix)) {
return originalBytes;
}
CtClass ctClass = readClass(originalBytes);
if (ctClass == null) return originalBytes;
try {
enhanceMethods(ctClass);
return ctClass.toBytecode();
} catch (IOException | CannotCompileException e) {
System.err.println("Couldn't enhance class " + className);
e.printStackTrace();
return originalBytes;
}
}
项目:spring
文件:WeavingTransformer.java
/**
* Apply transformation on a given class byte definition.
* The method will always return a non-null byte array (if no transformation has taken place
* the array content will be identical to the original one).
* @param className the full qualified name of the class in dot format (i.e. some.package.SomeClass)
* @param internalName class name internal name in / format (i.e. some/package/SomeClass)
* @param bytes class byte definition
* @param pd protection domain to be used (can be null)
* @return (possibly transformed) class byte definition
*/
public byte[] transformIfNecessary(String className, String internalName, byte[] bytes, ProtectionDomain pd) {
byte[] result = bytes;
for (ClassFileTransformer cft : this.transformers) {
try {
byte[] transformed = cft.transform(this.classLoader, internalName, null, pd, result);
if (transformed != null) {
result = transformed;
}
}
catch (IllegalClassFormatException ex) {
throw new IllegalStateException("Class file transformation failed", ex);
}
}
return result;
}
项目:thread-name-enhancer
文件:AgentTransformer.java
public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
try {
if(!"javax/servlet/http/HttpServlet".equals(className)) {
return null;
}
hookingCtx.set(loader);
ClassReader cr = new ClassReader(classfileBuffer);
ClassWriter cw = new ScouterClassWriter(ClassWriter.COMPUTE_FRAMES);
ClassVisitor cv = new ServletServiceProbe().transform(cw, className);
cr.accept(cv, ClassReader.SKIP_FRAMES);
System.out.println(className + "\t[" + loader + "]");
return cw.toByteArray();
} catch (Throwable t) {
t.printStackTrace();
} finally {
hookingCtx.set(null);
}
return null;
}
项目:FreeYourCode
文件:AgentClassFileTransformer.java
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
byte[] returnedBuffer = null;
for (Plugin plugin : plugins) {
if (plugin.handleClassDefinition(loader, className)) {
try {
String normalizedClassName = className.replaceAll("/", ".");
// If a program is running on a web application server such as JBoss and Tomcat, the ClassPool object may not be able to find user classes since such a web application server uses multiple class loaders as well as the system class
// loader.
classPool.insertClassPath(new LoaderClassPath(loader));
CtClass cc = classPool.get(normalizedClassName);
plugin.define(cc);
returnedBuffer = cc.toBytecode();
// FIXME verif le detach
cc.detach();
} catch (Exception e) {
logger.onGenerationFail(e.getMessage(), e);
}
}
}
return returnedBuffer;
}
项目:intellij-ce-playground
文件:ResetAgent.java
public static void premain(String options, Instrumentation inst) {
// Handle duplicate agents
if (initialized) {
return;
}
initialized = true;
inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if (classBeingRedefined != null) {
try {
Field callSiteArrayField = classBeingRedefined.getDeclaredField("$callSiteArray");
callSiteArrayField.setAccessible(true);
callSiteArrayField.set(null, null);
} catch (Throwable ignored) {
}
}
return removeTimestampField(classfileBuffer);
}
});
}
项目:tascalate-async-await
文件:AsyncAwaitEnhancerMojo.java
protected boolean rewriteClassFile(File source, AsyncAwaitClassFileGenerator generator, File target) throws IOException, IllegalClassFormatException {
final byte[] original = toByteArray(source);
try {
final byte[] transformed = generator.transform(original);
if (transformed != original /* Exact equality means not transformed */ || !source.equals(target)) {
writeFile(target, transformed != null ? transformed : original);
if (transformed != original) {
final Map<String, byte[]> extraClasses = generator.getGeneratedClasses();
for (Map.Entry<String, byte[]> e : renameInMemoryResources(extraClasses).entrySet()) {
writeFile(new File(target.getParentFile(), e.getKey()), e.getValue());
}
}
return true;
} else {
return false;
}
} finally {
generator.reset();
}
}
项目:jcarder
文件:ClassTransformer.java
public byte[] transform(final ClassLoader classLoader,
final String jvmInternalClassName,
final Class<?> classBeingRedefined,
final ProtectionDomain protectionDomain,
final byte[] originalClassBuffer)
throws IllegalClassFormatException {
String className = jvmInternalClassName.replace('/', '.');
try {
return instrument(classLoader, originalClassBuffer, className);
} catch (Throwable t) {
mLogger.severe("Failed to transform the class "
+ className + ": " + t.getMessage());
dumpClassToFile(originalClassBuffer,
mOriginalClassesDir,
className);
return null;
}
}
项目:jcarder
文件:TransformClassLoader.java
private Class<?> createTransformedClass(String className,
byte[] classBuffer)
throws ClassNotFoundException,
IllegalClassFormatException,
ClassNotTransformedException {
byte[] transformedClassBuffer = mTransformer.transform(this,
className,
null,
null,
classBuffer);
if (transformedClassBuffer == null) {
throw new ClassNotTransformedException("Class not transformed: "
+ className);
}
mTansformedClasses.add(className);
return defineClass(className,
transformedClassBuffer,
0,
transformedClassBuffer.length);
}
项目:powermock
文件:PowerMockClassTransformer.java
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if (loader == null || shouldIgnore(className)) {
return null;
}
try {
if (classesToTransform != null && classesToTransform.contains(className.replace("/", "."))) {
ByteArrayInputStream is = new ByteArrayInputStream(classfileBuffer);
CtClass ctClass = null;
try {
ctClass = ClassPool.getDefault().makeClass(is);
} finally {
is.close();
}
ctClass = mainMockTransformer.transform(ctClass);
return ctClass.toBytecode();
}
return null;
} catch(Exception e) {
throw new RuntimeException("Failed to redefine class "+className, e);
}
}
项目:Diorite
文件:TransformerOfInjectedClass.java
@Override
public byte[] transform(Controller controller, Instrumentation instr, Module module, ClassLoader loader, String className, Class<?> clazz,
ProtectionDomain pd, byte[] bytes) throws IllegalClassFormatException
{
if (clazz == null)
{
return null;
}
ControllerClassData classData = controller.getClassData(clazz);
if (classData == null)
{
return null;
}
try
{
Transformer classTransformer = new Transformer(bytes, classData);
// AsmUtils.printBytecodeSource(classTransformer.getWriter(), System.out);
classTransformer.run();
// AsmUtils.printBytecodeSource(classTransformer.getWriter(), System.out);
return classTransformer.getWriter().toByteArray();
} catch (Throwable e)
{
e.printStackTrace();
return null;
}
}
项目:Diorite
文件:AddClinitClassFileTransformer.java
@Nullable
@Override
public byte[] transform(Controller controller, Instrumentation instr, Module module, @Nullable ClassLoader loader, String className,
@Nullable Class<?> clazz, ProtectionDomain pd, byte[] bytecode) throws IllegalClassFormatException
{
// skip basic java classes
if (loader == null)
{
return null;
}
ClassReader cr = new ClassReader(bytecode);
ClassWriter cw = new ClassWriter(0);
ClinitClassVisitor classVisitor = new ClinitClassVisitor(cw);
cr.accept(classVisitor, 0);
if (! classVisitor.added)
{
return null;
}
return cw.toByteArray();
}
项目:QuickTheories
文件:CoverageTransformer.java
@Override
public byte[] transform(final ClassLoader loader, final String className,
final Class<?> classBeingRedefined,
final ProtectionDomain protectionDomain, final byte[] classfileBuffer)
throws IllegalClassFormatException {
final boolean include = shouldInclude(className);
if (include) {
try {
return transformBytes(loader, className, classfileBuffer);
} catch (final RuntimeException t) {
System.err.println("RuntimeException while transforming " + className);
throw t;
}
} else {
return null;
}
}
项目:memoizeit
文件:Instrument.java
@Override
public byte[] transform(ClassLoader loader,String className,Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException {
if (Util.isNotToProfile(className)) {
return null;
}
try {
final ClassReader classReader = new ClassReader(classfileBuffer);
final ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
final ClassVisitor profileAdapter = new ClassNodeAdapter(classWriter);
classReader.accept(profileAdapter, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
return classWriter.toByteArray();
} catch (final Exception ex) {
Debug.getInstance().debug("Field.Instrument", "Error instrumenting class " + className + ".");
return null;
}
}
项目:evosuite
文件:TransformerForTests.java
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException {
String classWithDots = className.replace('/', '.');
if(!active || !RuntimeInstrumentation.checkIfCanInstrument(classWithDots) || classWithDots.startsWith(PackageInfo.getEvoSuitePackage())){
return classfileBuffer;
} else {
//ClassResetter.getInstance().setClassLoader(loader);
ClassReader reader = new ClassReader(classfileBuffer);
synchronized(instrumentedClasses){
instrumentedClasses.add(classWithDots);
}
logger.debug("Going to instrument: "+classWithDots);
if(instrumenter.isAlreadyInstrumented(new ClassReader(classfileBuffer))) {
logger.debug("Skipping transformation of {} as it is already instrumented", classWithDots);
return classfileBuffer;
}
return instrumenter.transformBytes(loader, className, reader, false); // TODO: Need to set skip instrumentation for test class
}
}
项目:jreloader
文件:Transformer.java
public byte[] transform(ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] currentBytes) throws IllegalClassFormatException {
String clname = "bootstrap";
if (loader != null) {
clname = loader.getClass().getName() + "@"
+ Integer.toHexString(System.identityHashCode(loader));
}
Entry e = entries.get(className);
if (e != null) {
log.debug(clname + " is loading " + className);
}
if (e != null && loader != null) {
e.loaderRef = new WeakReference<ClassLoader>(loader);
}
return null;
}
项目:infobip-open-jdk-8
文件:RedefineAnnotations.java
@Override public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException {
if (className.contains("TypeAnnotatedTestClass")) {
try {
// Here we remove and re-add the dummy fields. This shuffles the constant pool
return asm(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
} catch (Throwable e) {
// The retransform native code that called this method does not propagate
// exceptions. Instead of getting an uninformative generic error, catch
// problems here and print it, then exit.
e.printStackTrace();
System.exit(1);
}
}
return null;
}
项目:scott
文件:TestClassTransformer.java
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if (loader == null) {
/*
* Leave the class alone, if it is being loaded by the Bootstrap classloader,
* as we don't want to do anything with JDK libs. See Issue #22.
*/
return classfileBuffer;
} else {
try {
TransformationParameters transformationParameters = calculateTransformationParameters(classfileBuffer);
return transform(classfileBuffer, transformationParameters);
} catch (Exception e) {
System.err.println("Scott: test instrumentation failed for " + className + "!");
e.printStackTrace();
throw e;
}
}
}
项目:murex-coding-dojo
文件:Agent.java
public static void premain(final String agentArgs, Instrumentation inst){
Agent.inst = inst;
System.out.printf("premain called");
inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
ClassPool cp = ClassPool.getDefault();
try {
if(className.equals("Application")){
final CtClass ctClass = cp.get("Application");
final CtMethod ctMethod = ctClass.getDeclaredMethod("hello");
ctMethod.insertBefore("return \"Bye\";");
classfileBuffer = ctClass.toBytecode();
ctClass.detach();
}
} catch (Exception e) {
e.printStackTrace();
}
return classfileBuffer;
}
});
}