java的反射机制

在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法;对于任意一个对象,都调用它的任意一个方法。

主要功能:在运行时,判断任意一个对象所属的类;在运行时,构造任意一个类的对象;在运行时,判断一个类所具有的成员变量和方法;在运行时,任意调用一个对象的方法;生成动态的代理。

1、得到某个对象的属性
public Object getProperty(Oject owner, String fieldName) throws Exception{
Class ownerClass = owner.getClass();
//得到对象的Class
Field field = ownerClass.getField(fieldName);
//通过Class得到类声明的属性
Object property = field.get(owner);
//通过对象得到该属性的实例,如果这个属性是非公有的,这里会出现IllegalAccessException
return property;
}

2、得到某个类的静态属性
public Object getStaticProperty(String className, String fieldName)throws Exception {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
// 因为该属性是静态的,所以直接从类的Class中取得
return property;
}

3、执行对象的方法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception{
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for(int i=0, j=args.length; i<j;i++){
argsClass[i] = args[i].getClass();
}
//配置参数的Class数组,作为寻找Method的条件
Method method = ownerClass.getMethod(methodName , argsClass);
//通过Method名和参数的Class数组得到要执行的Method
return method.invoke(owner, args);
//执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值
//执行某个类的静态方法:invoke的第一个参数是null
}

4、新建实例
public Object newInstance(String className, Object[] args) throws Exception{
class newOneClass = Class.forName(className);
//得到要构造实例的Class
class[] argsClass = new Class[args.length];
for(int i=0, j=args.length; i<j,i++){
argsClass[i] = args[i]getClass();
Constructor cons = newOneClass.getConstructor(argsClass);
//得到构造子
return cons.newInstance(args);
//新建实例
}
}

5、判断是否为某个类的实例
public boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
}

6、得到数组中的某个元素
public Object getByArray(Object array, int index) {
return Array.get(array,index);
}

7、调用无参的方法

    public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        MethodTest m 
= new MethodTest();
       m.setUp();
      
//待执行的方法名称注意没有()
     String methodName = "getInvoiceSortCode"
;

     
//先获取相应的method对象
       
//getMethod第一个参数是方法名,第二个参数是该方法的参数类型,
       
//因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法
        Method method = m.vo.getClass().getMethod(methodName,new Class[0]);
       
//接下来就该执行该方法了,解释一下参数
       
//第一个参数是具体调用该方法的对象
       
//第二个参数是执行该方法的具体参数
        System.out.println(methodName+"():"+method.invoke(m.vo,new Object[0]));    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值