反射是java语言重要的一个特征。反射技术在框架中实用的比较普遍
在这里举一些反射的简单用法。
在反射中实用的一个基本的类 Class
对一个对象可以使用obj.getClass()方法得到该对象的Class信息,Class.forName("记得要写类的全路径");还有基本类型的封装类型 如 Boolean.TYPE 都可以返回Class
得到对象的class信息,那你就可以获取这个的任何信息,类的父类,类实现的接口,类的成员变量,类的方法,类的改造函数,都可以获取。
下面举一些例子
------ 代码如下--------------
1, 接口
package com.refect;
public interface RefectInterface {
public void printPersonInfo(String str);
}
2,父类
package com.refect;
public class FRefectDemo {
private String args="";
public String getArgs() {
return args;
}
public void setArgs(String args) {
this.args = args;
}
public void driverCar(String carName){
System.out.println("father class method "+carName);
}
}
3,子类
package com.refect;
public class CRefectDemo extends FRefectDemo implements RefectInterface {
private String driverName="";
public String xx="";
public CRefectDemo() {
super();
}
public CRefectDemo(String driverName) {
super();
this.driverName = driverName;
}
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
public void driverCar(String carName){
System.out.println("children class method "+carName);
}
public void printPersonInfo(String str) {
// TODO Auto-generated method stub
}
}
4,测试类
package com.refect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FRefectDemo fd=new FRefectDemo();
FRefectDemo fcd=new CRefectDemo();
//fd.driverCar("bmw");
// fcd.driverCar("benchi");
Class c=fcd.getClass();
// System.out.println(c.getName());
Method[] m= c.getDeclaredMethods();
for(Method s:m){
//System.out.println(s.toString());
}
Constructor[] con=c.getDeclaredConstructors();
for(Constructor s:con){
//System.out.println(s.toString());
}
Constructor[] contruct=c.getConstructors();
for(Constructor s:con){
//System.out.println("fault---"+s.toString());
}
Field[] fie= c.getDeclaredFields();
for(Field f:fie){
System.out.println(f.toString());
}
Field[] field= c.getFields();
for(Field f:field){
System.out.println("----"+f.toString());
}
}
}
5,调用构造方法
Class cls = Class.forName("com.refect.constructor2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Constructor ct = cls.getConstructor(partypes);
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = ct.newInstance(arglist);
6,调用基本方法
Class cls = Class.forName("com.refect.method2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod("add", partypes);
method2 methobj = new method2();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = meth.invoke(methobj, arglist);
7,调用成员变量
Class cls = Class.forName("com.refect.field2");
Field fld = cls.getField("d");
field2 f2obj = new field2();
System.out.println("d = " + f2obj.d);
fld.setDouble(f2obj, 12.34);
System.out.println("d = " + f2obj.d);
刚学习反射技术,很多只是浅显的认识,抛砖引玉 望大虾踊跃指点。