Skip to content

Commit 6ce36d6

Browse files
committed
通过反射获取类的构造方法、字段、方法和注解等信息
1 parent 09e65a7 commit 6ce36d6

2 files changed

Lines changed: 144 additions & 4 deletions

File tree

‎README.md‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@
1919

2020

2121
#Java中级
22-
##Json
23-
###Gson
24-
####代码
22+
##反射
23+
* [获取方法、字段和注解](src/cn/aofeng/demo/java/lang/reflect/ClassAnalyze.java)
24+
25+
##序列化与反序列化
26+
###Json
27+
####Gson
28+
#####代码
2529
* [普通对象-序列化与反序列化](src/cn/aofeng/demo/json/gson/SimpleObjectSerialize.java)
2630
* [数组-序列化](src/cn/aofeng/demo/json/gson/ArraySerialize.java)
2731
* [数组-反序列化](src/cn/aofeng/demo/json/gson/ArrayDeserialize.java)
@@ -30,7 +34,7 @@
3034
* [自定义序列化](src/cn/aofeng/demo/json/gson/CustomSerialize.java)
3135
* [自定义反序列化](src/cn/aofeng/demo/json/gson/CustomDeserialize.java)
3236

33-
####文章
37+
#####文章
3438
* [Gson教程-序列化与反序列化基础操作](http://aofengblog.blog.163.com/blog/static/6317021201571275718825/)
3539

3640
##定时器
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package cn.aofeng.demo.java.lang.reflect;
2+
3+
import java.lang.annotation.Annotation;
4+
import java.lang.reflect.AnnotatedElement;
5+
import java.lang.reflect.Constructor;
6+
import java.lang.reflect.Field;
7+
import java.lang.reflect.Method;
8+
import java.lang.reflect.Modifier;
9+
10+
/**
11+
* 通过反射获取类的构造方法、字段、方法和注解等信息。
12+
*
13+
* @author <a href="mailto:[email protected]">聂勇</a>
14+
*/
15+
public class ClassAnalyze {
16+
17+
final static String PREFIX = "==========";
18+
final static String SUFFIX = PREFIX;
19+
20+
private static void parseClass(Class<?> claz) {
21+
// 注解
22+
parseAnnotation(claz);
23+
24+
// 类
25+
StringBuilder buffer = new StringBuilder(32)
26+
.append( Modifier.toString(claz.getModifiers()) )
27+
.append(' ')
28+
.append(claz.getName());
29+
log(buffer.toString());
30+
}
31+
32+
private static void parseConstructor(Constructor<?> c) {
33+
// 注解
34+
parseAnnotation(c);
35+
36+
// 构造方法
37+
StringBuilder buffer = new StringBuilder(32)
38+
.append( Modifier.toString(c.getModifiers()) )
39+
.append(' ')
40+
.append(c.getName())
41+
.append('(');
42+
43+
// 参数
44+
Class<?>[] params = c.getParameterTypes();
45+
for (int index = 0; index < params.length; index++) {
46+
buffer.append(params[index].getName());
47+
if (index!=params.length-1) {
48+
buffer.append(", ");
49+
}
50+
}
51+
buffer.append(')');
52+
53+
log(buffer.toString());
54+
}
55+
56+
private static void parseMethod(Method method) {
57+
// 注解
58+
parseAnnotation(method);
59+
60+
// 方法
61+
StringBuilder buffer = new StringBuilder(32)
62+
.append( Modifier.toString(method.getModifiers()) )
63+
.append(' ')
64+
.append(method.getName())
65+
.append('(');
66+
67+
// 参数
68+
Class<?>[] params = method.getParameterTypes();
69+
for (int index = 0; index < params.length; index++) {
70+
buffer.append(params[index].getName());
71+
if (index!=params.length-1) {
72+
buffer.append(", ");
73+
}
74+
}
75+
buffer.append(')');
76+
77+
log(buffer.toString());
78+
}
79+
80+
private static void parseField(Field field) {
81+
// 注解
82+
parseAnnotation(field);
83+
84+
// 字段
85+
StringBuilder buffer = new StringBuilder()
86+
.append(Modifier.toString(field.getModifiers()))
87+
.append(' ')
88+
.append(field.getName());
89+
log(buffer.toString());
90+
}
91+
92+
/**
93+
* 解析注解信息。
94+
*/
95+
private static void parseAnnotation(AnnotatedElement ae) {
96+
Annotation[] ans = ae.getDeclaredAnnotations();
97+
for (Annotation annotation : ans) {
98+
log(annotation.toString());
99+
}
100+
}
101+
102+
public static void log(String msg, Object... param) {
103+
System.out.println( String.format(msg, param) );
104+
}
105+
106+
public static void main(String[] args) throws ClassNotFoundException {
107+
if (args.length != 1) {
108+
log("无效的输入参数!");
109+
log("示例:");
110+
log("java cn.aofeng.demo.java.lang.reflect.ClassAnalyze java.util.HashMap");
111+
}
112+
Class<?> claz = Class.forName(args[0]);
113+
114+
log("%s类%s", PREFIX, SUFFIX);
115+
parseClass(claz);
116+
117+
log("%s构造方法%s", PREFIX, SUFFIX);
118+
Constructor<?>[] cs = claz.getDeclaredConstructors();
119+
for (Constructor<?> constructor : cs) {
120+
parseConstructor(constructor);
121+
}
122+
123+
log("%s字段%s", PREFIX, SUFFIX);
124+
Field[] fields = claz.getDeclaredFields();
125+
for (Field field : fields) {
126+
parseField(field);
127+
}
128+
129+
log("%s方法%s", PREFIX, SUFFIX);
130+
Method[] methods = claz.getDeclaredMethods();
131+
for (Method method : methods) {
132+
parseMethod(method);
133+
}
134+
}
135+
136+
}

0 commit comments

Comments
 (0)