- Class是一个描述类的类
- 里面封装了描述方法的Method;
- 里面封装了描述字段的Field;
- 里面封装了描述构造器 的Constructor等等属性。
- 如何获得一个Class对象:
- 类名.class();
- 类对象.getClass();
- Class.forName(类全名)
package cn.ihep.reflect;
public class User {
private String name;
private Integer age;
public User() {
super();
}
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
private void printMsg() {
System.out.println("I am " + this.name + ", this year i am " + this.age + " years old!!");
}
}
----------------------------------------------------------
package cn.ihep.reflect;
import org.junit.Test;
public class TestReflect {
@Test
public void test1() throws Exception {
Class clazz = User.class;
System.out.println(clazz);
Object u = new User();
Class clazz2 = u.getClass();
System.out.println(clazz2);
Class clazz3 = Class.forName("cn.ihep.reflect.User");
System.out.println(clazz3);
}
}
- 关于Method
如何获取Method:
1)、getDeclaredMethods:得到Method的数组;
2)、getDeclaredMethod(String methodName, Class ... parameterTypes);
如何调用Method:
1)、如果方法是private修饰,需要先调用Method的 setAccessible(true),使其变为可访问
2)、method.invoke(obj, Object ...args)
@Test
public void test2() throws Exception {
Class clazz = Class.forName("cn.ihep.reflect.User");
Method[] ms = clazz.getMethods();
for (Method m : ms) {
System.out.println(m);
}
System.out.println("---------------");
Method[] ms2 = clazz.getDeclaredMethods();
for (Method m : ms2) {
System.out.println(m);
}
System.out.println("---------------");
Method ms3 = clazz.getDeclaredMethod("setName", String.class);
System.out.println(ms3);
System.out.println("---------------");
Object o = new User("xiaoming", 18);
Method m4 = clazz.getDeclaredMethod("printMsg");
m4.setAccessible(true);
m4.invoke(o);
}
- 关于Field
如果获取Field:getField(String fieldName [这种方法只能获得公有字段,想获取公有,私有等所有字段的话用getDeclaredField(s)方法]
如何获取Field的值:
1)、setAccessible(true)
2)、field.get(Object obj)
如何设置Field的值:
1)、field.set(Object obj, Object val)
@Test
public void test3() throws Exception {
Class clazz = Class.forName("cn.ihep.reflect.User");
Field f1 = clazz.getDeclaredField("name");
System.out.println(f1);
System.out.println("----------------------------------");
// 私有,公有的字段都能拿到
Field[] fs = clazz.getDeclaredFields();
for (Field f : fs) {
System.out.println(f);
}
System.out.println("----------------------------------");
//这个getFields()方法只能访问公有字段---得到的fs2是空的
Field[] fs2 = clazz.getFields();
System.out.println("----------------------------------");
User u = new User("xiaoming", 18);
// age字段是私有的
Field f4 = clazz.getDeclaredField("age");
f4.setAccessible(true);
//无论是访问,或者是修改值,都需要设置setAccessible(true)
Object o = f4.get(u);
System.out.println(o);
f4.set(u, 60);
o = f4.get(u);
System.out.println(o);
}
总结:
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
Java反射机制主要提供了以下功能:
- 在运行时构造任意一个类的对象
- 在运行时获取任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法(属性)
- 生成动态代理
网友评论