反射笔记(转载)
Posted 一袭白衣一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射笔记(转载)相关的知识,希望对你有一定的参考价值。
概要:
Java反射机制详解
| |目录
1反射机制是什么
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2反射机制能做什么
反射机制主要提供了以下功能:
-
在运行时判断任意一个对象所属的类;
-
在运行时构造任意一个类的对象;
-
在运行时判断任意一个类所具有的成员变量和方法;
-
在运行时调用任意一个对象的方法;
-
生成动态代理。
3反射机制的相关API
通过一个对象获得完整的包名和类名
1
2
3
4
5
6
7
8
|
package net.xsoftlab.baike; public class TestReflect { public static void main(String[] args) throws Exception { TestReflect testReflect = new TestReflect(); System.out.println(testReflect.getClass().getName()); // 结果 net.xsoftlab.baike.TestReflect } } |
实例化Class类对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package net.xsoftlab.baike; public class TestReflect { public static void main(String[] args) throws Exception { Class<?> class1 = null ; Class<?> class2 = null ; Class<?> class3 = null ; // 一般采用这种形式 class1 = Class.forName( "net.xsoftlab.baike.TestReflect" ); class2 = new TestReflect().getClass(); class3 = TestReflect. class ; System.out.println( "类名称 " + class1.getName()); System.out.println( "类名称 " + class2.getName()); System.out.println( "类名称 " + class3.getName()); } } |
获取一个对象的父类与实现的接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package net.xsoftlab.baike; import java.io.Serializable; public class TestReflect implements Serializable { private static final long serialVersionUID = -2862585049955236662L; public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName( "net.xsoftlab.baike.TestReflect" ); // 取得父类 Class<?> parentClass = clazz.getSuperclass(); System.out.println( "clazz的父类为:" + parentClass.getName()); // clazz的父类为: java.lang.Object // 获取所有的接口 Class<?> intes[] = clazz.getInterfaces(); System.out.println( "clazz实现的接口有:" ); for ( int i = 0 ; i < intes.length; i++) { System.out.println((i + 1 ) + ":" + intes[i].getName()); } // clazz实现的接口有: // 1:java.io.Serializable } } |
获取某个类中的全部构造函数 - 详见下例
通过反射机制实例化一个类的对象
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
|
package net.xsoftlab.baike; import java.lang.reflect.Constructor; public class TestReflect { public static void main(String[] args) throws Exception { Class<?> class1 = null ; class1 = Class.forName( "net.xsoftlab.baike.User" ); // 第一种方法,实例化默认构造方法,调用set赋值 User user = (User) class1.newInstance(); user.setAge( 20 ); user.setName( "Rollen" ); System.out.println(user); // 结果 User [age=20, name=Rollen] // 第二种方法 取得全部的构造函数 使用构造函数赋值 Constructor<?> cons[] = class1.getConstructors(); // 查看每个构造方法需要的参数 for ( int i = 0 ; i < cons.length; i++) { Class<?> clazzs[] = cons[i].getParameterTypes(); System.out.print( "cons[" + i + "] (" ); for ( int j = 0 ; j < clazzs.length; j++) { if (j == clazzs.length - 1 ) System.out.print(clazzs[j].getName()); else System.out.print(clazzs[j].getName() + "," ); } System.out.println( ")" ); } // 结果 // cons[0] (java.lang.String) // cons[1] (int,java.lang.String) // cons[2] () user = (User) cons[ 0 ].newInstance( "Rollen" ); System.out.println(user); // 结果 User [age=0, name=Rollen] user = (User) cons[ 1 ].newInstance( 20 , "Rollen" ); System.out.println(user); // 结果 User [age=20, name=Rollen] } } class User { private int age; private String name; public User() { super (); } public User(String name) { super (); this .name = name; } public User( int age, String name) { super (); this .age = age; this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } public String getName() { return name; } public void setName(String name) { this .name = name; } @Override public String toString() { return "User [age=" + age + ", name=" + name + "]" ; } } |
获取某个类的全部属性
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
|
package net.xsoftlab.baike; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class TestReflect implements Serializable { private static final long serialVersionUID = -2862585049955236662L; public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName( "net.xsoftlab.baike.TestReflect" ); System.out.println( "===============本类属性===============" ); // 取得本类的全部属性 Field[] field = clazz.getDeclaredFields(); for ( int i = 0 ; i < field.length; i++) { // 权限修饰符 int mo = field[i].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = field[i].getType(); System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";" ); } System.out.println( "==========实现的接口或者父类的属性==========" ); // 取得实现的接口或者父类的属性 Field[] filed1 = clazz.getFields(); for ( int j = 0 ; j < filed1.length; j++) { // 权限修饰符 int mo = filed1[j].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = filed1[j].getType(); System.out.println(priv + " " + type.getName() + " " + filed1[j].getName() + ";" ); } } } |
获取某个类的全部方法
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
|
package net.xsoftlab.baike; import java.io.Serializable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class TestReflect implements Serializable { private static final long serialVersionUID = -2862585049955236662L; public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName( "net.xsoftlab.baike.TestReflect" ); Method method[] = clazz.getMethods(); for ( int i = 0 ; i < method.length; ++i) { Class<?> returnType = method[i].getReturnType(); Class<?> para[] = method[i].getParameterTypes(); int temp = method[i].getModifiers(); System.out.print(Modifier.toString(temp) + " " ); System.out.print(returnType.getName() + " " ); System.out.print(method[i].getName() + " " ); System.out.print( "(" ); for ( int j = 0 ; j < para.length; ++j) { System.out.print(para[j].getName() + " " + "arg" + j); if (j < para.length - 1 ) { System.out.print( "," ); } } Class<?> exce[] = method[i].getExceptionTypes(); if (exce.length > 0 ) { System.out.print( ") throws " ); for ( int k = 0 ; k < exce.length; ++k) { System.out.print(exce[k].getName() + " " ); if (k < exce.length - 1 ) { System.out.print( "," ); } } } else { System.out.print( ")" ); } System.out.println(); } } } |
通过反射机制调用某个类的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect { public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName( "net.xsoftlab.baike.TestReflect" ); // 调用TestReflect类中的reflect1方法 Method method = clazz.getMethod( "reflect1" ); method.invoke(clazz.newInstance()); // Java 反射机制 - 调用某个类的方法1. // 调用TestReflect的reflect2方法 |