Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_langtools
提交
974e831f
D
dragonwell8_langtools
项目概览
openanolis
/
dragonwell8_langtools
通知
0
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_langtools
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
974e831f
编写于
12月 12, 2009
作者:
J
jjg
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6907575: [classfile] add support for classfile dependency analysis
Reviewed-by: ksrini
上级
10e7c2c7
变更
6
展开全部
显示空白变更内容
内联
并排
Showing
6 changed file
with
1135 addition
and
0 deletion
+1135
-0
src/share/classes/com/sun/tools/classfile/Dependencies.java
src/share/classes/com/sun/tools/classfile/Dependencies.java
+718
-0
src/share/classes/com/sun/tools/classfile/Dependency.java
src/share/classes/com/sun/tools/classfile/Dependency.java
+90
-0
test/tools/javap/classfile/deps/GetDeps.java
test/tools/javap/classfile/deps/GetDeps.java
+211
-0
test/tools/javap/classfile/deps/T6907575.java
test/tools/javap/classfile/deps/T6907575.java
+71
-0
test/tools/javap/classfile/deps/T6907575.out
test/tools/javap/classfile/deps/T6907575.out
+8
-0
test/tools/javap/classfile/deps/p/C1.java
test/tools/javap/classfile/deps/p/C1.java
+37
-0
未找到文件。
src/share/classes/com/sun/tools/classfile/Dependencies.java
0 → 100644
浏览文件 @
974e831f
此差异已折叠。
点击以展开。
src/share/classes/com/sun/tools/classfile/Dependency.java
0 → 100644
浏览文件 @
974e831f
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package
com.sun.tools.classfile
;
/**
* A directed relationship between two {@link Dependency.Location Location}s.
* Subtypes of {@code Dependency} may provide additional detail about the dependency.
*
* @see Dependency.Finder
* @see Dependency.Filter
* @see Dependencies
*/
public
interface
Dependency
{
/**
* A filter used to select dependencies of interest, and to discard others.
*/
public
interface
Filter
{
/**
* Return true if the dependency is of interest.
* @param dependency the dependency to be considered
* @return true if and only if the dependency is of interest.
*/
boolean
accepts
(
Dependency
dependency
);
}
/**
* An interface for finding the immediate dependencies of a given class file.
*/
public
interface
Finder
{
/**
* Find the immediate dependencies of a given class file.
* @param classfile the class file to be examined
* @return the set of dependencies located in the given class file.
*/
public
Iterable
<?
extends
Dependency
>
findDependencies
(
ClassFile
classfile
);
}
/**
* A location somewhere within a class. Subtypes of {@code Location}
* may be used to provide additional detail about the location.
*/
public
interface
Location
{
/**
* Get the name of the class containing the location.
* This name will be used to locate the class file for transitive
* dependency analysis.
* @return the name of the class containing the location.
*/
String
getClassName
();
}
/**
* Get the location that has the dependency.
* @return the location that has the dependency.
*/
Location
getOrigin
();
/**
* Get the location that is being depended upon.
* @return the location that is being depended upon.
*/
Location
getTarget
();
}
test/tools/javap/classfile/deps/GetDeps.java
0 → 100644
浏览文件 @
974e831f
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
import
java.io.*
;
import
java.util.*
;
import
java.util.regex.Pattern
;
import
javax.tools.*
;
import
com.sun.tools.classfile.*
;
import
com.sun.tools.classfile.Dependencies.*
;
import
com.sun.tools.classfile.Dependency.Location
;
import
com.sun.tools.javac.file.JavacFileManager
;
import
com.sun.tools.javac.util.Context
;
/**
* Demo utility for using the classfile dependency analysis API framework.
*
* Usage:
* getdeps [options] classes
* where options include:
* -classpath path where to find classes to analyze
* -p package-name restrict analysis to classes in this package
* (may be given multiple times)
* -r regex restrict analysis to packages matching pattern
* (-p and -r are exclusive)
* -rev invert the dependencies in the output
* -t transitive closure of dependencies
*/
public
class
GetDeps
{
public
static
void
main
(
String
...
args
)
throws
Exception
{
new
GetDeps
().
run
(
args
);
}
void
run
(
String
...
args
)
throws
IOException
,
ClassFileNotFoundException
{
PrintWriter
pw
=
new
PrintWriter
(
System
.
out
);
try
{
run
(
pw
,
args
);
}
finally
{
pw
.
flush
();
}
}
void
run
(
PrintWriter
out
,
String
...
args
)
throws
IOException
,
ClassFileNotFoundException
{
decodeArgs
(
args
);
final
StandardJavaFileManager
fm
=
new
JavacFileManager
(
new
Context
(),
false
,
null
);
if
(
classpath
!=
null
)
fm
.
setLocation
(
StandardLocation
.
CLASS_PATH
,
classpath
);
ClassFileReader
reader
=
new
ClassFileReader
(
fm
);
Dependencies
d
=
new
Dependencies
();
if
(
regex
!=
null
)
d
.
setFilter
(
Dependencies
.
getRegexFilter
(
Pattern
.
compile
(
regex
)));
if
(
packageNames
.
size
()
>
0
)
d
.
setFilter
(
Dependencies
.
getPackageFilter
(
packageNames
,
false
));
SortedRecorder
r
=
new
SortedRecorder
(
reverse
);
d
.
findAllDependencies
(
reader
,
rootClassNames
,
transitiveClosure
,
r
);
SortedMap
<
Location
,
SortedSet
<
Dependency
>>
deps
=
r
.
getMap
();
for
(
Map
.
Entry
<
Location
,
SortedSet
<
Dependency
>>
e:
deps
.
entrySet
())
{
out
.
println
(
e
.
getKey
());
for
(
Dependency
dep:
e
.
getValue
())
{
out
.
println
(
" "
+
dep
.
getTarget
());
}
}
}
void
decodeArgs
(
String
...
args
)
{
rootClassNames
=
new
TreeSet
<
String
>();
packageNames
=
new
TreeSet
<
String
>();
for
(
int
i
=
0
;
i
<
args
.
length
;
i
++)
{
String
arg
=
args
[
i
];
if
(
arg
.
equals
(
"-classpath"
)
&&
(
i
+
1
<
args
.
length
))
classpath
=
getPathFiles
(
args
[++
i
]);
else
if
(
arg
.
equals
(
"-p"
)
&&
(
i
+
1
<
args
.
length
))
packageNames
.
add
(
args
[++
i
]);
else
if
(
arg
.
equals
(
"-r"
)
&&
(
i
+
1
<
args
.
length
))
regex
=
args
[++
i
];
else
if
(
arg
.
equals
(
"-rev"
))
reverse
=
true
;
else
if
(
arg
.
equals
(
"-t"
))
transitiveClosure
=
true
;
else
if
(
arg
.
startsWith
(
"-"
))
throw
new
Error
(
arg
);
else
{
for
(
;
i
<
args
.
length
;
i
++)
rootClassNames
.
add
(
args
[
i
]);
}
}
}
List
<
File
>
getPathFiles
(
String
path
)
{
List
<
File
>
files
=
new
ArrayList
<
File
>();
for
(
String
p:
path
.
split
(
File
.
pathSeparator
))
{
if
(
p
.
length
()
>
0
)
files
.
add
(
new
File
(
p
));
}
return
files
;
}
boolean
transitiveClosure
;
List
<
File
>
classpath
;
Set
<
String
>
rootClassNames
;
Set
<
String
>
packageNames
;
String
regex
;
boolean
reverse
;
static
class
ClassFileReader
implements
Dependencies
.
ClassFileReader
{
private
JavaFileManager
fm
;
ClassFileReader
(
JavaFileManager
fm
)
{
this
.
fm
=
fm
;
}
@Override
public
ClassFile
getClassFile
(
String
className
)
throws
ClassFileNotFoundException
{
try
{
JavaFileObject
fo
=
fm
.
getJavaFileForInput
(
StandardLocation
.
CLASS_PATH
,
className
,
JavaFileObject
.
Kind
.
CLASS
);
if
(
fo
==
null
)
fo
=
fm
.
getJavaFileForInput
(
StandardLocation
.
PLATFORM_CLASS_PATH
,
className
,
JavaFileObject
.
Kind
.
CLASS
);
if
(
fo
==
null
)
throw
new
ClassFileNotFoundException
(
className
);
InputStream
in
=
fo
.
openInputStream
();
try
{
return
ClassFile
.
read
(
in
);
}
finally
{
in
.
close
();
}
}
catch
(
ConstantPoolException
e
)
{
throw
new
ClassFileNotFoundException
(
className
,
e
);
}
catch
(
IOException
e
)
{
throw
new
ClassFileNotFoundException
(
className
,
e
);
}
}
};
static
class
SortedRecorder
implements
Recorder
{
public
SortedRecorder
(
boolean
reverse
)
{
this
.
reverse
=
reverse
;
}
public
void
addDependency
(
Dependency
d
)
{
Location
o
=
(
reverse
?
d
.
getTarget
()
:
d
.
getOrigin
());
SortedSet
<
Dependency
>
odeps
=
map
.
get
(
o
);
if
(
odeps
==
null
)
{
Comparator
<
Dependency
>
c
=
(
reverse
?
originComparator
:
targetComparator
);
map
.
put
(
o
,
odeps
=
new
TreeSet
<
Dependency
>(
c
));
}
odeps
.
add
(
d
);
}
public
SortedMap
<
Location
,
SortedSet
<
Dependency
>>
getMap
()
{
return
map
;
}
private
Comparator
<
Dependency
>
originComparator
=
new
Comparator
<
Dependency
>()
{
public
int
compare
(
Dependency
o1
,
Dependency
o2
)
{
return
o1
.
getTarget
().
toString
().
compareTo
(
o2
.
getOrigin
().
toString
());
}
};
private
Comparator
<
Dependency
>
targetComparator
=
new
Comparator
<
Dependency
>()
{
public
int
compare
(
Dependency
o1
,
Dependency
o2
)
{
return
o1
.
getTarget
().
toString
().
compareTo
(
o2
.
getTarget
().
toString
());
}
};
private
Comparator
<
Location
>
locationComparator
=
new
Comparator
<
Location
>()
{
public
int
compare
(
Location
o1
,
Location
o2
)
{
return
o1
.
toString
().
compareTo
(
o2
.
toString
());
}
};
private
final
SortedMap
<
Location
,
SortedSet
<
Dependency
>>
map
=
new
TreeMap
<
Location
,
SortedSet
<
Dependency
>>(
locationComparator
);
boolean
reverse
;
}
}
test/tools/javap/classfile/deps/T6907575.java
0 → 100644
浏览文件 @
974e831f
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/*
* @test
* @bug 6907575
* @build GetDeps p.C1
* @run main T6907575
*/
import
java.io.*
;
public
class
T6907575
{
public
static
void
main
(
String
...
args
)
throws
Exception
{
new
T6907575
().
run
();
}
void
run
()
throws
Exception
{
String
testSrc
=
System
.
getProperty
(
"test.src"
);
String
testClasses
=
System
.
getProperty
(
"test.classes"
);
StringWriter
sw
=
new
StringWriter
();
PrintWriter
pw
=
new
PrintWriter
(
sw
);
GetDeps
gd
=
new
GetDeps
();
gd
.
run
(
pw
,
"-classpath"
,
testClasses
,
"-t"
,
"-p"
,
"p"
,
"p/C1"
);
pw
.
close
();
System
.
out
.
println
(
sw
);
String
ref
=
readFile
(
new
File
(
testSrc
,
"T6907575.out"
));
diff
(
sw
.
toString
().
replaceAll
(
"[\r\n]+"
,
"\n"
),
ref
);
}
void
diff
(
String
actual
,
String
ref
)
throws
Exception
{
System
.
out
.
println
(
"EXPECT:>>>"
+
ref
+
"<<<"
);
System
.
out
.
println
(
"ACTUAL:>>>"
+
actual
+
"<<<"
);
if
(!
actual
.
equals
(
ref
))
throw
new
Exception
(
"output not as expected"
);
}
String
readFile
(
File
f
)
throws
IOException
{
Reader
r
=
new
FileReader
(
f
);
char
[]
buf
=
new
char
[(
int
)
f
.
length
()];
int
offset
=
0
;
int
n
;
while
(
offset
<
buf
.
length
&&
(
n
=
r
.
read
(
buf
,
offset
,
buf
.
length
-
offset
))
!=
-
1
)
offset
+=
n
;
return
new
String
(
buf
,
0
,
offset
);
}
}
test/tools/javap/classfile/deps/T6907575.out
0 → 100644
浏览文件 @
974e831f
p/C1
java/lang/Object
p/C2
p/C2
java/lang/Object
p/C3
p/C3
java/lang/Object
test/tools/javap/classfile/deps/p/C1.java
0 → 100644
浏览文件 @
974e831f
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package
p
;
public
class
C1
{
C2
c2
;
}
class
C2
{
C3
c3
;
}
class
C3
{
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录