1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/*******************************************************************************
* Copyright (c) Copyright (c) Copyright (c) 2009, 2012 Mountainminds GmbH & Co. KG and Contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc R. Hoffmann - initial API and implementation
*
*******************************************************************************/
package org.jacoco.core.test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Loads a single class from a byte array.
*/
public class TargetLoader extends ClassLoader {
private final String sourcename;
private final byte[] bytes;
private final Class<?> clazz;
public TargetLoader(final String name, final byte[] bytes) {
super(TargetLoader.class.getClassLoader());
this.sourcename = name;
this.bytes = bytes;
clazz = load(name);
}
public TargetLoader(final Class<?> source, final byte[] bytes) {
super(TargetLoader.class.getClassLoader());
this.sourcename = source.getName();
this.bytes = bytes;
clazz = load(source.getName());
}
private Class<?> load(final String sourcename) {
try {
return loadClass(sourcename);
} catch (ClassNotFoundException e) {
// must not happen
throw new RuntimeException(e);
}
}
public Class<?> getTargetClass() {
return clazz;
}
public Object newTargetInstance() throws InstantiationException,
IllegalAccessException {
return clazz.newInstance();
}
public static InputStream getClassData(Class<?> clazz) {
final String resource = "/" + clazz.getName().replace('.', '/')
+ ".class";
return clazz.getResourceAsStream(resource);
}
public static byte[] getClassDataAsBytes(Class<?> clazz) throws IOException {
InputStream in = getClassData(clazz);
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[0x100];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
in.close();
return out.toByteArray();
}
@Override
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException {
if (sourcename.equals(name)) {
Class<?> c = defineClass(name, bytes, 0, bytes.length);
if (resolve) {
resolveClass(c);
}
return c;
}
return super.loadClass(name, resolve);
}
}
|