您的位置:首页 > 编程语言 > Java开发

Java反射机制与应用

2015-10-18 00:00 363 查看
JAVA反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

JAVA反射应用

Java反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;

生成动态代理。

常用方法

①. 判断对象是否属于反射得到的类(isInstance)

class S {
}
public class IsInstance {
public static void main(String args[]) {
try {
Class cls = Class.forName("S");
boolean b1 = cls.isInstance(new Integer(37));
System.out.println(b1);
boolean b2 = cls.isInstance(new S());
System.out.println(b2);
}
catch (Throwable e) {
System.err.println(e);
}
}
}


在这个例子中创建了一个S 类的 Class 对象,然后检查一些对象是否是S的实例。结果输出false和true。说明Integer(37) 不是,但 new S()是。

②. 获取某个反射类的所有属性字段

/**
* 获取反射类的所有属性字段
*
* @param ownerClass 反射的类
* @return
* @throws Exception
*/
public Field[] getProperty(Class ownerClass) throws Exception {

//获取该类所有属性字段
//Field[] fields = ownerClass.getFields();//只获取public访问权限的属性字段(包括父类的)
Field[] fields = ownerClass.getDeclaredFields();//只获取该类的所有访问权限的属性(不含父类)

//输出所有属性字段
for(int i=0;i<fields.length;i++){
System.out.println("属性:"+fields[i]);
}

return fields;
}


③. 获取反射类的某个public属性值

/**
* 获取反射类的某个public属性值
*
* @param ownerClass 反射的类
* @param fieldName 属性名
* @return
* @throws Exception
*/
public Object getProperty(Object owner,String fieldName) throws Exception {

//得到对象所属类
Class ownerClass = owner.getClass();

//获取该类的某个属性
Field field = ownerClass.getField(fieldName);

//获取某个对象的特定属性
Object property = field.get(owner);

//输出该属性信息
System.out.println(fieldName+"的属性值:"+property.toString());

return property;

}


④.获取反射类的该中的所有方法

/**
* 获取反射类的该中的所有方法
* @param ownerClass 反射的类
* @return
* @throws Exception
*/
public Method[] getMethods(Class ownerClass) throws Exception {

//获取该类所有方法
//Field[] fields = ownerClass.getMethods();//只获取public访问权限的方法(包括父类的)
Method[] methods = ownerClass.getDeclaredMethods();//只获取该类的所有访问权限的方法(不含父类)

//输出所有方法
for(int i=0;i<methods.length;i++){
System.out.println("方法:" +methods[i]);
}

return methods;
}


⑤. 执行反射类的该中的某个方法

/**
* 执行反射类的该中的某个方法
* @param ownerClass 反射的类
* @param methodName 方法名
* @return
* @throws Exception
*/
public Object invokeMethod(Object owner,String methodName,Object[] args) throws Exception {

//得到对象所属类
Class ownerClass = owner.getClass();

//获取该类的某个方法
Method method = ownerClass.getMethod(methodName, null);

//执行某个对象的方法
Object result = method.invoke(owner, args);

//输出结果信息
System.out.println("结果返回值:"+ result);

return result;
}


实例演示方法:

/**
* 测试反射常用方法
*/
public void refTest(){
String className = "com.java.reflecttest.Student";

try {

//通过反射机制,使用类装载器,装载该类
Class<?> stu = Class.forName(className);
Object objStu = stu.newInstance();

//获取反射类的所有属性
System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
System.out.println("调用 getProperty 方法,获取Student类的所有属性");
getProperty(stu);

//获取反射类的某个属性值
System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
System.out.println("调用 getProperty 方法,获取Student类的NAME属性值");
getProperty(objStu,"NAME");

//获取反射类的所有方法
System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
System.out.println("调用 getMethods 方法,获取Student类的所有方法");
getMethods(stu);

//执行反射类的getInfo方法
System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
System.out.println("调用 invokeMethod 方法,执行Student类的getInfo方法");
invokeMethod(objStu, "getInfo", null);

} catch (Exception e) {
e.printStackTrace();
}
}


演示所用的Student类

package com.java.reflecttest;

/**
* 学生信息类
*
* @author Longxuan
*
*/
public class Student {

/**
* 学号
*/
private String stuId ;

/**
* 学号
*/
public String STUID;

/**
* 姓名
*/
private String name ;

/**
* 姓名
*/
public String NAME;

/**
* 年龄
*/
private int age;

/**
* 年龄
*/
public int AGE;

/**
* 班级
*/
private String classid;

public String getStuId() {
return stuId;
}

public void setStuId(String stuId) {
this.stuId = stuId;
}

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 String getClassid() {
return classid;
}

public void setClassid(String classid) {
this.classid = classid;
}

/**
* 输出学生信息
*/
public void getInfo(){
System.out.println("学生信息:\n学号:"+stuId+"\t姓名:"+name+"\t年龄:"+age+"\t班级:"+classid);
}

/**
* 构造函数
*/
public Student(){
init();
}

/**
* 私有初始化方法
*/
private void init(){
this.name = "张三";
this.stuId ="1001";
this.age = 14;
this.classid = "A001";
this.NAME = name;
this.AGE = age;
this.STUID = stuId;
}

}


运行结果:





版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: