摘、学自:API + http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html
JAVA反射
Java反射是Java被视为动态语言的一个关键性质。它允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(如public, static .. )、superclass(如Object .. )、实现的interfaces(如Cloneable .. ),也包括fields和methods的所有信 息,并可于运行时改变fields内容或调用methods。
具体功能
- 获取类的Class 对象
- 获取类的Fields
- 获取类的Method
- 获取类的Constructor
- 新建类的实例 ( Class<T>的函数 newInstance , 通过Constructor 对象的方法 newInstance )
- 调用类的函数 ( 调用private 函数 )
- 设置/ 获取类的属性值 ( private属性 )
- 动态创建代理类
示例
父类:PersonPo
package javas.reflectss;
/**
* 父类
* @author Hust
* @Time 2011-11-3
*/
public class PersonPo {
private String name;
private String pass;
public PersonPo() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
子类UserPo
package javas.reflectss;
/**
* 测试的类
*
* @author Hust
* @Time 2011-11-3
*/
public class UserPo extends PersonPo {
private int id;
float height;
protected double weight;
public boolean active;
public UserPo() {
}
public UserPo(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public void print(){
System.out.println("in UserPo.java print method ");
}
public void print(String s){
System.out.println("in UserPo.java print method String s " + s);
}
public void print(String s,String t){
System.out.println("in UserPo.java print method " + s + t);
}
public void print(String ... s){
System.out.println("in UserPo.java print method String ... s" + s);
}
}
另一测试类UserClass
package javas.reflectss;
/**
* 测试
* @author Hust
* @Time 2011-11-3
*/
public class UserClass {
public int id;
public String class_name;
public int class_code;
public UserClass() {
}
public UserClass(int id,String name,int node) {
this.id = id;
this.class_name = name;
this.class_code = node;
testPrivateM();
}
/**
* private
*/
private void testPrivateM(){
System.out.println("in testPrivateM" + id + class_name+class_code);
}
/**
* proteced
*/
protected void testProtectedM(){
System.out.println("in testProtectedM" + id + class_name+class_code);
}
/**
* public
*/
protected void testPublicM(){
System.out.println("in testPublicM" + id + class_name+class_code);
}
}
反射测试类ReflectionTest
package javas.reflectss;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 反射测试
* @author Hust
* @Time 2011-11-3
*/
public class ReflectionTest {
public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchFieldException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
testFieldMethodConstractor();//取其中变量、方法、构造方法
//callMethod();//调用方法
//setGetFiled();//设置/获取类的属性值
}
/**
* 设置/获取类的属性值
* @throws InstantiationException
* @throws IllegalAccessException
* @throws SecurityException
* @throws NoSuchFieldException
*/
public static void setGetFiled() throws InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException{
Class<UserClass> userClass = UserClass.class;
UserClass po = userClass.newInstance();
Field intField = userClass.getDeclaredField("id");
intField.set(po, 100);
int getValue = intField.getInt(po);
System.out.println(getValue);
}
/**
* 调用方法
* @throws NoSuchMethodException
* @throws SecurityException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws InvocationTargetException
* @throws IllegalArgumentException
*/
public static void callMethod() throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class<UserPo> userPo = UserPo.class;
UserPo inst = userPo.newInstance();//会调用对象的默认构造器
System.out.println("实例:"+inst);
Method m = userPo.getDeclaredMethod("print", (Class[]) null);
Method m2 = userPo.getMethod("print", String.class); //参数为String
Method m3 = userPo.getMethod("print", String.class,String.class); //参数为String,String
Method m4 = userPo.getDeclaredMethod("print", String[].class);
m.invoke(inst, null); //调用print()方法
m2.invoke(inst, "123"); //调用print(String)方法
m3.invoke(inst, "456","789"); //调用print(String,String)方法
m4.invoke(inst, new Object[]{new String[]{"123","456"}}); //调用print(String[])方法
Class<UserClass> userClass = UserClass.class;
//UserClass po = userClass.newInstance();
Constructor<?> co = userClass.getConstructor(int.class,String.class,int.class);
Object o = co.newInstance(1,"234",5);
Method mc = userClass.getDeclaredMethod("testPublicM");
//mc.setAccessible(true);
mc.invoke(o, null); //调用构造方法(int,String,int)
}
/**
* 取其中变量、方法、构造方法
* @throws NoSuchFieldException
* @throws SecurityException
* @throws NoSuchMethodException
* @throws ClassNotFoundException
*/
public static void testFieldMethodConstractor() throws SecurityException, NoSuchFieldException, NoSuchMethodException, ClassNotFoundException{
//获得基本类型的类信息
//Class<UserPo> userPo = UserPo.class;// 1
//UserPo po = userPo.newInstance();po.setActive(true);
Class<?> userPo = Class.forName("javas.reflectss.UserPo"); // 2
//Class<?> bb = Boolean.TYPE;//boolean 3
System.out.println("====getDeclaredFields = Class对象所表示的类或接口的所有字段=");
Field[] fields = userPo.getDeclaredFields();
for(Field f : fields){
System.out.println(f);
/* 打印结果
private int javas.reflectss.UserPo.id
float javas.reflectss.UserPo.height
protected double javas.reflectss.UserPo.weight
public boolean javas.reflectss.UserPo.active
* */
}
System.out.println("====getDeclaredField = Class对象所表示的类或接口的指定字段=");
Field fieldsd = userPo.getDeclaredField("height");
//取相应的类型
System.out.println(fieldsd.getGenericType());//float
System.out.println(fieldsd.getGenericType().toString().equals("float"));//true
System.out.println("====getFields = Class对象所表示的类或接口所声明的所有可访问公共字段=");
Field[] fieldss = userPo.getFields();
for(Field f : fieldss){
System.out.println(f);//public boolean javas.reflectss.UserPo.active
}
System.out.println("====getMethods = Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member方法=");
Method[] methods = userPo.getMethods();
for(Method m : methods){
System.out.println(m);
/* 所有公共方法
public int javas.reflectss.UserPo.getId()
public void javas.reflectss.UserPo.print(java.lang.String,java.lang.String)
public void javas.reflectss.UserPo.print(java.lang.String)
.....
public java.lang.String javas.reflectss.PersonPo.getName() //父类的方法
public void javas.reflectss.PersonPo.setName(java.lang.String)
public java.lang.String javas.reflectss.PersonPo.getPass()
public void javas.reflectss.PersonPo.setPass(java.lang.String)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
*/
}
System.out.println("====getDeclaredMethods = Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法=");
Method[] methodss = userPo.getDeclaredMethods();
for(Method m : methodss){
System.out.println(m);
/* 仅公共方法
public int javas.reflectss.UserPo.getId()
public void javas.reflectss.UserPo.print(java.lang.String,java.lang.String)
public void javas.reflectss.UserPo.print(java.lang.String)
.....
public void javas.reflectss.UserPo.print(java.lang.String)
*/
}
System.out.println("====getDeclaredMethods=Class对象所表示的类或接口的指定已声明方法");
Method methodsms = userPo.getDeclaredMethod("getHeight", (Class[]) null);
System.out.println(methodsms);//public float javas.reflectss.UserPo.getHeight()
System.out.println("====使用getConstructors获取构造器 ");
Constructor<?>[] constructors = userPo.getConstructors();
for (Constructor<?> m : constructors){
System.out.println(m);
/*
public javas.reflectss.UserPo(int)
public javas.reflectss.UserPo()
**/
}
}
}
打印结果及说明见注释。