现在的位置: 首页 > 综合 > 正文

java reflection 反射实用

2013年09月10日 ⁄ 综合 ⁄ 共 2872字 ⁄ 字号 评论关闭

  反射是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);

 

刚学习反射技术,很多只是浅显的认识,抛砖引玉 望大虾踊跃指点。

抱歉!评论已关闭.