java-反射
来源:互联网 发布:软件测试目的 编辑:程序博客网 时间:2024/06/11 04:52
1 .java中的类加载器有3种
JVM有三种类加载器:bootstrap负责加载系统类,extclassloader负责加载扩展类,appclassloader负责加载应用类
这三个加载器就构成我们的 Java 类加载体系。他们分别从以下的路径寻找程序所需要的类: BootstrapLoader : sun.boot.class.path ExtClassLoader: java.ext.dirs AppClassLoader: java.class.path
2.通过反射可以获得类的完整结构
package
cn.itcast;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.Field;
import
java.lang.reflect.Method;
import
java.lang.reflect.Modifier;
public
class
ClassDemo05 {
public
static
void
main(String[] args) {
Class<?> c1 =
null
;
try
{
c1 = Class.forName(
"cn.itcast.Person"
);
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(
"-----------------获取实现的全部接口----------------"
);
// 获取实现的全部接口
Class<?> interfaces[] = c1.getInterfaces();
for
(Class<?> thisclass : interfaces) {
System.out.println(thisclass.getName());
}
System.out.println(
"-----------------取得父类----------------"
);
Class<?> superclass = c1.getSuperclass();
System.out.println(superclass.getName());
System.out.println(
"-----------------取得一个类中的全部的构造方法----------------"
);
Constructor<?> constructors[] = c1.getConstructors();
for
(
int
i =
0
; i < constructors.length; i++) {
Class<?> parameterTypes[] = constructors[i].getParameterTypes();
//取得权限
int
modifiers = constructors[i].getModifiers();
//还原权限(public static String toString(int mod))
System.out.println(Modifier.toString(modifiers));
//输出构造方法名称
String name = constructors[i].getName();
//循环打印参数类型
for
(
int
j =
0
; j < parameterTypes.length; j++) {
System.out.println(parameterTypes[j]);
System.out.println(modifiers);
System.out.println(name);
}
}
System.out.println(
"-----------------------取得全部的方法-------------------------"
);
//获取全部的方法
Method[] methods = c1.getMethods();
for
(
int
j =
0
; j < methods.length; j++) {
System.out.println(methods[j]);
//得到方法的返回值类型
Class<?> returnType = methods[j].getReturnType();
System.out.println(returnType);
//得到全部参数的类型
Class<?>[] parameterTypes2 = methods[j].getParameterTypes();
for
(Class<?> class1 : parameterTypes2) {
System.out.println(class1);
}
//获得全部异常抛出
Class<?>[] exceptionTypes = methods[j].getExceptionTypes();
//判断是否有异常
if
(exceptionTypes.length>
0
)
{
System.out.println(
") throws "
);
}
else
{
System.out.println(
")"
);
}
for
(
int
i =
0
; i < exceptionTypes.length; i++) {
System.out.println(exceptionTypes[i].getName());
if
(i<exceptionTypes.length-
1
)
{
System.out.println(
","
);
}
}
System.out.println();
}
System.out.println(
"==================取得本类全部属性=================="
);
//得到本类中的属性
Field[] declaredFields = c1.getDeclaredFields();
for
(
int
i =
0
; i < declaredFields.length; i++) {
//取得本类中属性类型
Class<?> type = declaredFields[i].getType();
System.out.println(type);
//得到修饰符的数字
int
modifiers = declaredFields[i].getModifiers();
System.out.println(modifiers);
//取得属性的修饰符
String priv = Modifier.toString(modifiers);
System.out.println(priv);
}
System.out.println(
"==================取得父类全部属性=================="
);
Field[] fields = c1.getFields();
for
(
int
i =
0
; i < fields.length; i++) {
Class<?> type = fields[i].getType();
System.out.println(type);
int
modifiers = fields[i].getModifiers();
System.out.println(modifiers);
String priv = Modifier.toString(modifiers);
System.out.println(priv);
}
}
}
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
Person类:
package
cn.itcast02;
public
class
Person
implements
China{
private
String name;
private
int
age;
private
char
sex;
public
Person() {
super
();
}
public
Person(String name,
int
age,
char
sex) {
super
();
this
.name = name;
this
.age = age;
this
.sex = sex;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
int
getAge() {
return
age;
}
public
void
setAge(
int
age) {
this
.age = age;
}
public
char
getSex() {
return
sex;
}
public
void
setSex(
char
sex) {
this
.sex = sex;
}
public
void
eat()
{
System.out.println(
"吃了"
);
}
@Override
public
String toString() {
return
"Person [name="
+ name +
", age="
+ age +
", sex="
+ sex +
"]"
;
}
@Override
public
void
sayChina() {
// TODO Auto-generated method stub
System.out.println(
"作者:"
+ AUTHOR +
"国籍:"
+ NATIONAL);
}
@Override
public
String sayHello(String name,
int
age,
char
sex) {
// TODO Auto-generated method stub
return
"姓名:"
+ name +
"年龄:"
+ age +
"性别:"
+ sex;
}
}
1
2
3
4
5
6
7
8
9
10
11
China接口:
package
cn.itcast02;
public
interface
China {
public
static
final
String NATIONAL =
"China"
;
public
static
final
String AUTHOR =
"成龙"
;
public
void
sayChina();
public
String sayHello(String name,
int
age,
char
sex);
}
3.利用反射创建类则需要该类有无参的构造函数
以前写的些方法都是这样干的:
Class cls = Class.forName(“className”);
*** inst = cls.newInstance();
那样只能调用默认构造函数,也就是没有参数的,前几天要整个反射类,调用的是有参构造函数,解决如下:
Class cls = Class.forName(className);
Class[] paramTypes = { String.class, String.class, String.class,
String.class };
Object[] params = {bankCde, branchCde, buzDate, loanNo}; // 方法传入的参数
Constructor con = cls.getConstructor(paramTypes); //主要就是这句了
BatcherBase base = (BatcherBase) con.newInstance(params); //BatcherBase 为自定义类
4.动态代理用到反射模式
0 0
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- C语言8.8总结
- 中软Java学习第八天笔记之队列和栈
- 打开目录,读取目录 ,然后获得文件状态
- 数据结构实验之排序二:交换排序
- 异步 Notification 之 NSNotificationQueue
- java-反射
- HDU 4003 Find Metal Mineral(树形dp,从根节点出发k个机器人遍历所有边的最小代价和)
- A. Cards
- 占座
- 中软第八天学习笔记之ArrayList
- DataGridView右键删除行
- Android之十七 进度条和Hanlder
- 初学HTML5--新增标签
- 搜索引擎学习