Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
ab5e4a4f
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ab5e4a4f
编写于
11月 19, 2009
作者:
C
Costin Leau
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
SPR-6333
SPR-6393 + eliminated compile-time dependency on oc4j classes
上级
856fefea
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
190 addition
and
148 deletion
+190
-148
org.springframework.context/.classpath
org.springframework.context/.classpath
+1
-4
org.springframework.context/context.iml
org.springframework.context/context.iml
+0
-29
org.springframework.context/ivy.xml
org.springframework.context/ivy.xml
+0
-5
org.springframework.context/pom.xml
org.springframework.context/pom.xml
+0
-18
org.springframework.context/src/main/java/org/springframework/instrument/classloading/oc4j/OC4JClassLoaderAdapter.java
.../instrument/classloading/oc4j/OC4JClassLoaderAdapter.java
+88
-0
org.springframework.context/src/main/java/org/springframework/instrument/classloading/oc4j/OC4JClassPreprocessorAdapter.java
...ument/classloading/oc4j/OC4JClassPreprocessorAdapter.java
+95
-81
org.springframework.context/src/main/java/org/springframework/instrument/classloading/oc4j/OC4JLoadTimeWeaver.java
...work/instrument/classloading/oc4j/OC4JLoadTimeWeaver.java
+6
-11
未找到文件。
org.springframework.context/.classpath
浏览文件 @
ab5e4a4f
...
...
@@ -11,7 +11,6 @@
<classpathentry
combineaccessrules=
"false"
kind=
"src"
path=
"/org.springframework.expression"
/>
<classpathentry
combineaccessrules=
"false"
kind=
"src"
path=
"/org.springframework.instrument"
/>
<classpathentry
kind=
"lib"
path=
"/org.springframework.asm/target/artifacts/org.springframework.asm.jar"
sourcepath=
"/org.springframework.asm/target/artifacts/org.springframework.asm-sources.jar"
/>
<classpathentry
kind=
"var"
path=
"IVY_CACHE/com.oracle.oc4j/com.springsource.oracle.classloader/10.1.3.1/com.springsource.oracle.classloader-10.1.3.1.jar"
/>
<classpathentry
kind=
"var"
path=
"IVY_CACHE/com.sun.enterprise/com.springsource.com.sun.enterprise.loader/1.0.0/com.springsource.com.sun.enterprise.loader-1.0.0.jar"
/>
<classpathentry
kind=
"var"
path=
"IVY_CACHE/edu.emory.mathcs.backport/com.springsource.edu.emory.mathcs.backport/3.0.0/com.springsource.edu.emory.mathcs.backport-3.0.0.jar"
sourcepath=
"/IVY_CACHE/edu.emory.mathcs.backport/com.springsource.edu.emory.mathcs.backport/3.0.0/com.springsource.edu.emory.mathcs.backport-sources-3.0.0.jar"
/>
<classpathentry
kind=
"var"
path=
"IVY_CACHE/javax.ejb/com.springsource.javax.ejb/3.0.0/com.springsource.javax.ejb-3.0.0.jar"
sourcepath=
"/IVY_CACHE/javax.ejb/com.springsource.javax.ejb/3.0.0/com.springsource.javax.ejb-sources-3.0.0.jar"
/>
...
...
@@ -38,8 +37,6 @@
<classpathentry
kind=
"var"
path=
"IVY_CACHE/org.jruby/com.springsource.org.jruby/1.2.0/com.springsource.org.jruby-1.2.0.jar"
sourcepath=
"/IVY_CACHE/org.jruby/com.springsource.org.jruby/1.2.0/com.springsource.org.jruby-sources-1.2.0.jar"
/>
<classpathentry
kind=
"var"
path=
"IVY_CACHE/org.junit/com.springsource.org.junit/4.7.0/com.springsource.org.junit-4.7.0.jar"
sourcepath=
"/IVY_CACHE/org.junit/com.springsource.org.junit/4.7.0/com.springsource.org.junit-sources-4.6.0.jar"
/>
<classpathentry
kind=
"var"
path=
"IVY_CACHE/javax.inject/com.springsource.org.atinject.tck/1.0.0/com.springsource.org.atinject.tck-1.0.0.jar"
sourcepath=
"/IVY_CACHE/javax.inject/com.springsource.org.atinject.tck/1.0.0/com.springsource.org.atinject.tck-sources-1.0.0.jar"
/>
<classpathentry
kind=
"var"
path=
"IVY_CACHE/org.jboss.cl/com.springsource.org.jboss.classloader/2.0.5.GA/com.springsource.org.jboss.classloader-2.0.5.GA.jar"
/>
<classpathentry
kind=
"var"
path=
"IVY_CACHE/org.jboss.integration/com.springsource.org.jboss.classloading.spi/5.0.3.GA/com.springsource.org.jboss.classloading.spi-5.0.3.GA.jar"
/>
<classpathentry
kind=
"var"
path=
"IVY_CACHE/org.jboss.util/com.springsource.org.jboss.util/2.2.13.GA/com.springsource.org.jboss.util-2.2.13.GA.jar"
/>
<classpathentry
kind=
"output"
path=
"target/classes"
/>
</classpath>
org.springframework.context/context.iml
浏览文件 @
ab5e4a4f
...
...
@@ -98,15 +98,6 @@
</SOURCES>
</library>
</orderEntry>
<orderEntry
type=
"module-library"
>
<library>
<CLASSES>
<root
url=
"jar://$IVY_CACHE$/com.oracle.oc4j/com.springsource.oracle.classloader/10.1.3.1/com.springsource.oracle.classloader-10.1.3.1.jar!/"
/>
</CLASSES>
<JAVADOC
/>
<SOURCES
/>
</library>
</orderEntry>
<orderEntry
type=
"module-library"
>
<library>
<CLASSES>
...
...
@@ -127,26 +118,6 @@
</SOURCES>
</library>
</orderEntry>
<orderEntry
type=
"module-library"
>
<library>
<CLASSES>
<root
url=
"jar://$IVY_CACHE$/org.jboss.cl/com.springsource.org.jboss.classloader/2.0.5.GA/com.springsource.org.jboss.classloader-2.0.5.GA.jar!/"
/>
</CLASSES>
<JAVADOC
/>
<SOURCES
/>
</library>
</orderEntry>
<orderEntry
type=
"module-library"
>
<library>
<CLASSES>
<root
url=
"jar://$IVY_CACHE$/org.jboss.util/com.springsource.org.jboss.util/2.2.9.GA/com.springsource.org.jboss.util-2.2.9.GA.jar!/"
/>
</CLASSES>
<JAVADOC
/>
<SOURCES>
<root
url=
"jar://$IVY_CACHE$/org.jboss.util/com.springsource.org.jboss.util/2.2.9.GA/com.springsource.org.jboss.util-sources-2.2.9.GA.jar!/"
/>
</SOURCES>
</library>
</orderEntry>
<orderEntry
type=
"module-library"
>
<library>
<CLASSES>
...
...
org.springframework.context/ivy.xml
浏览文件 @
ab5e4a4f
...
...
@@ -30,7 +30,6 @@
</publications>
<dependencies>
<dependency
org=
"com.oracle.oc4j"
name=
"com.springsource.oracle.classloader"
rev=
"10.1.3.1"
conf=
"provided->compile"
/>
<dependency
org=
"com.sun.enterprise"
name=
"com.springsource.com.sun.enterprise.loader"
rev=
"1.0.0"
conf=
"provided->compile"
/>
<dependency
org=
"edu.emory.mathcs.backport"
name=
"com.springsource.edu.emory.mathcs.backport"
rev=
"3.0.0"
conf=
"optional, backport-util-concurrent->compile"
/>
<dependency
org=
"javax.annotation"
name=
"com.springsource.javax.annotation"
rev=
"1.0.0"
conf=
"provided, ejb->compile"
/>
...
...
@@ -46,10 +45,6 @@
<dependency
org=
"org.aspectj"
name=
"com.springsource.org.aspectj.weaver"
rev=
"1.6.5.RELEASE"
conf=
"optional, aspectj->compile"
/>
<dependency
org=
"org.beanshell"
name=
"com.springsource.bsh"
rev=
"2.0.0.b4"
conf=
"optional, beanshell->compile"
/>
<dependency
org=
"org.codehaus.groovy"
name=
"com.springsource.org.codehaus.groovy"
rev=
"1.6.3"
conf=
"optional, groovy->compile"
/>
<!--
<dependency org="org.jboss.cl" name="com.springsource.org.jboss.classloader" rev="2.0.5.GA" conf="provided->compile"/>
<dependency org="org.jboss.util" name="com.springsource.org.jboss.util" rev="2.2.13.GA" conf="provided, runtime->compile"/>
-->
<dependency
org=
"org.joda"
name=
"com.springsource.org.joda.time"
rev=
"1.6.0"
conf=
"optional->compile"
/>
<dependency
org=
"org.jruby"
name=
"com.springsource.org.jruby"
rev=
"1.2.0"
conf=
"optional, jruby->compile"
/>
<dependency
org=
"org.springframework"
name=
"org.springframework.asm"
rev=
"latest.integration"
conf=
"compile->compile"
/>
...
...
org.springframework.context/pom.xml
浏览文件 @
ab5e4a4f
...
...
@@ -15,12 +15,6 @@
</parent>
<dependencies>
<dependency>
<groupId>
com.oracle.oc4j
</groupId>
<artifactId>
com.springsource.oracle.classloader
</artifactId>
<version>
10.1.3.1
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
com.sun.enterprise
</groupId>
<artifactId>
com.springsource.com.sun.enterprise.loader
</artifactId>
...
...
@@ -129,18 +123,6 @@
<version>
1.6
</version>
<optional>
true
</optional>
</dependency>
<dependency>
<groupId>
org.jboss.cl
</groupId>
<artifactId>
com.springsource.org.jboss.classloader
</artifactId>
<version>
2.0.5.GA
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
org.jboss.util
</groupId>
<artifactId>
com.springsource.org.jboss.util
</artifactId>
<version>
2.2.13.GA
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
org.springframework
</groupId>
<artifactId>
spring-asm
</artifactId>
...
...
org.springframework.context/src/main/java/org/springframework/instrument/classloading/oc4j/OC4JClassLoaderAdapter.java
0 → 100644
浏览文件 @
ab5e4a4f
/*
* Copyright 2006-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.springframework.instrument.classloading.oc4j
;
import
java.lang.instrument.ClassFileTransformer
;
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Method
;
import
java.lang.reflect.Proxy
;
import
org.springframework.util.Assert
;
/**
* Reflective wrapper around a OC4J class loader. Used to
* encapsulate the classloader-specific methods (discovered and
* called through reflection) from the load-time weaver.
*
* @author Costin Leau
*/
class
OC4JClassLoaderAdapter
{
private
static
final
String
CL_UTILS
=
"oracle.classloader.util.ClassLoaderUtilities"
;
private
static
final
String
PREPROCESS_UTILS
=
"oracle.classloader.util.ClassPreprocessor"
;
private
final
ClassLoader
classLoader
;
private
final
Class
<?>
processorClass
;
private
final
Method
addTransformer
;
private
final
Method
copy
;
public
OC4JClassLoaderAdapter
(
ClassLoader
classLoader
)
{
try
{
// Since OC4J 10.1.3's PolicyClassLoader is going to be removed,
// we rely on the ClassLoaderUtilities API instead.
Class
<?>
utilClass
=
classLoader
.
loadClass
(
CL_UTILS
);
this
.
processorClass
=
classLoader
.
loadClass
(
PREPROCESS_UTILS
);
this
.
addTransformer
=
utilClass
.
getMethod
(
"addPreprocessor"
,
new
Class
[]
{
ClassLoader
.
class
,
this
.
processorClass
});
this
.
copy
=
utilClass
.
getMethod
(
"copy"
,
new
Class
[]
{
ClassLoader
.
class
});
}
catch
(
Exception
ex
)
{
throw
new
IllegalStateException
(
"Could not initialize OC4J LoadTimeWeaver because OC4J API classes are not available"
,
ex
);
}
this
.
classLoader
=
classLoader
;
}
public
void
addTransformer
(
ClassFileTransformer
transformer
)
{
Assert
.
notNull
(
transformer
,
"ClassFileTransformer must not be null"
);
try
{
OC4JClassPreProcessorAdapter
adapter
=
new
OC4JClassPreProcessorAdapter
(
transformer
);
Object
adapterInstance
=
Proxy
.
newProxyInstance
(
this
.
processorClass
.
getClassLoader
(),
new
Class
[]
{
this
.
processorClass
},
adapter
);
this
.
addTransformer
.
invoke
(
null
,
new
Object
[]
{
this
.
classLoader
,
adapterInstance
});
}
catch
(
InvocationTargetException
ex
)
{
throw
new
IllegalStateException
(
"OC4J addPreprocessor method threw exception"
,
ex
.
getCause
());
}
catch
(
Exception
ex
)
{
throw
new
IllegalStateException
(
"Could not invoke OC4J addPreprocessor method"
,
ex
);
}
}
public
ClassLoader
getClassLoader
()
{
return
this
.
classLoader
;
}
public
ClassLoader
getThrowawayClassLoader
()
{
try
{
return
(
ClassLoader
)
this
.
copy
.
invoke
(
null
,
new
Object
[]
{
this
.
classLoader
});
}
catch
(
InvocationTargetException
ex
)
{
throw
new
IllegalStateException
(
"OC4J copy method failed"
,
ex
.
getCause
());
}
catch
(
Exception
ex
)
{
throw
new
IllegalStateException
(
"Could not copy OC4J classloader"
,
ex
);
}
}
}
\ No newline at end of file
org.springframework.context/src/main/java/org/springframework/instrument/classloading/oc4j/OC4JClassPreprocessorAdapter.java
浏览文件 @
ab5e4a4f
/*
* Copyright 2002-2006 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.springframework.instrument.classloading.oc4j
;
import
oracle.classloader.util.ClassPreprocessor
;
import
org.springframework.util.Assert
;
import
java.lang.instrument.ClassFileTransformer
;
import
java.lang.instrument.IllegalClassFormatException
;
import
java.security.ProtectionDomain
;
/**
* {@link ClassPreprocessor} adapter for OC4J, delegating to a standard
* JDK {@link ClassFileTransformer} underneath.
*
* <p>Many thanks to <a href="mailto:mike.keith@oracle.com">Mike Keith</a>
* for his assistance.
*
* @author Costin Leau
* @since 2.0
*/
class
OC4JClassPreprocessorAdapter
implements
ClassPreprocessor
{
private
final
ClassFileTransformer
transformer
;
/**
* Creates a new instance of the {@link OC4JClassPreprocessorAdapter} class.
* @param transformer the {@link ClassFileTransformer} to be adapted (must not be <code>null</code>)
* @throws IllegalArgumentException if the supplied <code>transformer</code> is <code>null</code>
*/
public
OC4JClassPreprocessorAdapter
(
ClassFileTransformer
transformer
)
{
Assert
.
notNull
(
transformer
,
"Transformer must not be null"
);
this
.
transformer
=
transformer
;
}
public
ClassPreprocessor
initialize
(
ClassLoader
loader
)
{
return
this
;
}
public
byte
[]
processClass
(
String
className
,
byte
origClassBytes
[],
int
offset
,
int
length
,
ProtectionDomain
pd
,
ClassLoader
loader
)
{
try
{
byte
[]
tempArray
=
new
byte
[
length
];
System
.
arraycopy
(
origClassBytes
,
offset
,
tempArray
,
0
,
length
);
// NB: OC4J passes className as "." without class while the
// transformer expects a VM, "/" format
byte
[]
result
=
this
.
transformer
.
transform
(
loader
,
className
.
replace
(
'.'
,
'/'
),
null
,
pd
,
tempArray
);
return
(
result
!=
null
?
result
:
origClassBytes
);
}
catch
(
IllegalClassFormatException
ex
)
{
throw
new
IllegalStateException
(
"Cannot transform because of illegal class format"
,
ex
);
}
}
@Override
public
String
toString
()
{
StringBuilder
builder
=
new
StringBuilder
(
getClass
().
getName
());
builder
.
append
(
" for transformer: "
);
builder
.
append
(
this
.
transformer
);
return
builder
.
toString
();
}
}
/*
* Copyright 2006-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.springframework.instrument.classloading.oc4j
;
import
java.lang.instrument.ClassFileTransformer
;
import
java.lang.instrument.IllegalClassFormatException
;
import
java.lang.reflect.InvocationHandler
;
import
java.lang.reflect.Method
;
import
java.security.ProtectionDomain
;
/**
* Adapter that implements OC4J ClassPreProcessor interface, delegating to a
* standard JDK {@link ClassFileTransformer} underneath.
*
* <p>To avoid compile time checks again the vendor API, a dynamic proxy is
* being used.
*
* @author Costin Leau
*/
class
OC4JClassPreProcessorAdapter
implements
InvocationHandler
{
private
final
ClassFileTransformer
transformer
;
/**
* Creates a new {@link OC4JClassPreProcessorAdapter}.
* @param transformer the {@link ClassFileTransformer} to be adapted (must
* not be <code>null</code>)
*/
public
OC4JClassPreProcessorAdapter
(
ClassFileTransformer
transformer
)
{
this
.
transformer
=
transformer
;
}
public
Object
invoke
(
Object
proxy
,
Method
method
,
Object
[]
args
)
throws
Throwable
{
String
name
=
method
.
getName
();
if
(
"equals"
.
equals
(
name
))
{
return
(
Boolean
.
valueOf
(
proxy
==
args
[
0
]));
}
else
if
(
"hashCode"
.
equals
(
name
))
{
return
hashCode
();
}
else
if
(
"toString"
.
equals
(
name
))
{
return
toString
();
}
else
if
(
"initialize"
.
equals
(
name
))
{
initialize
(
proxy
,
(
ClassLoader
)
args
[
0
]);
return
null
;
}
else
if
(
"processClass"
.
equals
(
name
))
{
return
processClass
((
String
)
args
[
0
],
(
byte
[])
args
[
1
],
(
Integer
)
args
[
2
],
(
Integer
)
args
[
3
],
(
ProtectionDomain
)
args
[
4
],
(
ClassLoader
)
args
[
5
]);
}
else
{
throw
new
IllegalArgumentException
(
"Unknown method: "
+
method
);
}
}
// maps to oracle.classloader.util.ClassPreprocessor#initialize
// the proxy is passed since it implements the Oracle interface which
// is asked as a return type
public
Object
initialize
(
Object
proxy
,
ClassLoader
loader
)
{
return
proxy
;
}
public
byte
[]
processClass
(
String
className
,
byte
origClassBytes
[],
int
offset
,
int
length
,
ProtectionDomain
pd
,
ClassLoader
loader
)
{
try
{
byte
[]
tempArray
=
new
byte
[
length
];
System
.
arraycopy
(
origClassBytes
,
offset
,
tempArray
,
0
,
length
);
// NB: OC4J passes className as "." without class while the
// transformer expects a VM, "/" format
byte
[]
result
=
this
.
transformer
.
transform
(
loader
,
className
.
replace
(
'.'
,
'/'
),
null
,
pd
,
tempArray
);
return
(
result
!=
null
?
result
:
origClassBytes
);
}
catch
(
IllegalClassFormatException
ex
)
{
throw
new
IllegalStateException
(
"Cannot transform because of illegal class format"
,
ex
);
}
}
@Override
public
String
toString
()
{
StringBuilder
builder
=
new
StringBuilder
(
getClass
().
getName
());
builder
.
append
(
" for transformer: "
);
builder
.
append
(
this
.
transformer
);
return
builder
.
toString
();
}
}
\ No newline at end of file
org.springframework.context/src/main/java/org/springframework/instrument/classloading/oc4j/OC4JLoadTimeWeaver.java
浏览文件 @
ab5e4a4f
...
...
@@ -18,8 +18,6 @@ package org.springframework.instrument.classloading.oc4j;
import
java.lang.instrument.ClassFileTransformer
;
import
oracle.classloader.util.ClassLoaderUtilities
;
import
org.springframework.instrument.classloading.LoadTimeWeaver
;
import
org.springframework.util.Assert
;
import
org.springframework.util.ClassUtils
;
...
...
@@ -38,8 +36,7 @@ import org.springframework.util.ClassUtils;
*/
public
class
OC4JLoadTimeWeaver
implements
LoadTimeWeaver
{
private
final
ClassLoader
classLoader
;
private
final
OC4JClassLoaderAdapter
classLoader
;
/**
* Creates a new instance of thie {@link OC4JLoadTimeWeaver} class
...
...
@@ -49,7 +46,7 @@ public class OC4JLoadTimeWeaver implements LoadTimeWeaver {
public
OC4JLoadTimeWeaver
()
{
this
(
ClassUtils
.
getDefaultClassLoader
());
}
/**
* Creates a new instance of the {@link OC4JLoadTimeWeaver} class
* using the supplied {@link ClassLoader}.
...
...
@@ -57,23 +54,21 @@ public class OC4JLoadTimeWeaver implements LoadTimeWeaver {
*/
public
OC4JLoadTimeWeaver
(
ClassLoader
classLoader
)
{
Assert
.
notNull
(
classLoader
,
"ClassLoader must not be null"
);
this
.
classLoader
=
classLoader
;
this
.
classLoader
=
new
OC4JClassLoaderAdapter
(
classLoader
)
;
}
public
void
addTransformer
(
ClassFileTransformer
transformer
)
{
Assert
.
notNull
(
transformer
,
"Transformer must not be null"
);
// Since OC4J 10.1.3's PolicyClassLoader is going to be removed,
// we rely on the ClassLoaderUtilities API instead.
OC4JClassPreprocessorAdapter
processor
=
new
OC4JClassPreprocessorAdapter
(
transformer
);
ClassLoaderUtilities
.
addPreprocessor
(
this
.
classLoader
,
processor
);
classLoader
.
addTransformer
(
transformer
);
}
public
ClassLoader
getInstrumentableClassLoader
()
{
return
this
.
classLoader
;
return
classLoader
.
getClassLoader
()
;
}
public
ClassLoader
getThrowawayClassLoader
()
{
return
ClassLoaderUtilities
.
copy
(
this
.
classLoader
);
return
classLoader
.
getThrowawayClassLoader
(
);
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录