- 反射机制
反射是用来解刨Java的类、构造器(Constructor)、方法(Method)、属性(Field)等元素的信息。
反射是为了动态地加载一个类,动态调用一个方法,动态访问一个属性等要求而设计的,通过使用
java.lang.reflect下面的API。
- Class
每一个Class类一种被加载进入JVM的类,代表该类的一种信息映射。通过下面三种方式可获取Class对象
1、Class类的forname()方法返回
2、访问所有类都会拥有的静态class属性
3、调用所有对象都会有的getClass方法
实现ReflectClass.java
package com.pro.reflect;
/**
* 反射实体类
* @author GeekHou
*/
public class ReflectClass {
protected String name;
protected int age;
public ReflectClass(String name,int age) {
this.name = name;
this.age = age;
}
public ReflectClass() {
super();
}
public void testMethod() {
System.out.println("testMethord is called...");
}
}
package com.pro.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ClassTest {
public static void main(String[] args) {
// 1 反射操作类的成员变量
ReflectClass obj1 = new ReflectClass("张三",24);
ReflectClass obj2 = new ReflectClass("李四",25);
System.out.println("操作类的成员变量:"+compare(obj1, obj2).name+"年龄大一点");
// 2 反射实例化类 ,需要实现默认构造函数
String methodName = "testMethod";
Class<ReflectClass> clazz = ReflectClass.class;// 获得class实例
try {
Method method = clazz.getMethod(methodName);// 获得指定方法名的Method对象
if (method != null) {
ReflectClass obj = clazz.newInstance();// 无参方式创建对象
method.invoke(obj);// 调用obj指定的方法
}
} catch (Exception e) {
e.printStackTrace();
}
// 3 反射实例化一个类
try {
Constructor<ReflectClass> reflectClass = clazz.getConstructor(String.class,int.class);
ReflectClass reflectObj = reflectClass.newInstance("小子",21);
System.out.println(reflectObj);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 操作类的成员变量
* @param obj1
* @param obj2
* @return
*/
private static ReflectClass compare(ReflectClass obj1,ReflectClass obj2) {
// 两种方式获取一个Field对象
try {
// Field field = obj1.getClass().getDeclaredField("age");
Field field = ReflectClass.class.getDeclaredField("age");
// 访问私有成员
// field.setAccessible(true);
int age1 = (Integer)field.get(obj1);
int age2 = (Integer)field.get(obj2);
if (age1>age2) {
return obj1;
} else {
return obj2;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
延伸
Struts2 Hibernate Spring中均使用反射的机制实现,特别是Spring中的依赖注入反转控制、面向切面编程融入了反射的思想。
附上几个使用反射实例实现验证及Spring的链接
1、Java 简单校验框架
2、基于java反射的验证框架
3、非常好的Java反射例子
4、Spring反射机制
[ 作者csdn博客]