反射没有什么神奇之处
Class类与java.lang.reflect类库一起对于 反射 的概念进行了支持,该类库包含了Field Method 以及Constructor 类(每个类都实现了Member接口)。这些类型的对象是有JVM在运行时创建的,用以表示未知类里对应的成员。这样你就可以使用Constructor创建新的对象,用get()和set()方法读取和修改与Field对象关联的字段,用invoke方法调用与Method对象相关联的方法。另外,还可以调用getFields() getMethods() 和getConstructors()登遍历的方法,一返回表示字段 方法 和构造器的对象的数组。这样,匿名对象的类的信息就能在运行时被确定下来,而在编译期不需要知道任何事情!
对于反射机制来说,.class文件在编译期是不可获取的,所以在运行时打开和检查.class文件!
运用反射在运行期加载Person类对象!
- Person.java
public class Person {
private String name;
private int age;
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 Person(int age) {
this.age = age;
}
}
- ReflectDemo.java
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
public class ReflectDemo {
public static void main(String[] args) {
Person p = null;
try {
Class<?> cls = Class.forName(args[0]);
System.out.println(cls.getName() + " ----- ConstructorList:");
/* 得到构造器列表 */
Constructor<?>[] constructors = cls.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor.getName() + "---"
+ constructor.getParameterCount());
if (constructor.getParameterCount() == 1)
/* 通过构造器构造对象,需要转型 */
p = (Person) constructor.newInstance(new Integer(12));
}
/* 获取通过构造器设置的Age属性 */
System.out.println(p.getAge());
System.out.println();
System.out.println(cls.getName() + " ----- MethodList:");
Method[] methods = cls.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
/* 执行方法 */
if (method.getName().equals("setName"))
method.invoke(p, "Jay");
}
/* 验证是否成功执行setName()方法 */
System.out.println(p.getName());
System.out.println();
System.out.println(cls.getName() + " ----- PropertyList:");
Field[] fields = cls.getFields();
/* 私有变量不能显示 */
for (Field field : fields) {
System.out.println(field.getName());
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
- 运行