Java反射机制

java反射机制给我们在开发中带来了很多的便利,下面是我在imooc上看到的一些知识点的总结,第一个代码:

package com.tiger.reflect;

public class ExampleOne {
    public static void main(String[] args)  {

        //方法1:当已知类的名称的时候,可以直接获得其实例
        Class model1=Model.class;

        //方法2:当已知一个该类的对象的时候
        Class model2=model1.getClass();

        System.out.println(model1==model2);

        //方法3:当已知该类的一个实例的时候,使用该方法也可以直接获取该类的一个实例
        Class model3=null;
        try {
            model3=Class.forName("com.tiger.reflect.Model");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("不管是哪种方式获得的类的实例,他们其实都是类类型(class type)的表现"
        +"一个类仅仅是java.lang.Class的对象,它不可能有两种类型,所以获得的只是同一个实例:");
        System.out.println("model1==model2?"+(model1==model2));
        System.out.println("model1==model3?"+(model2==model3));
    }

}

class Model {}

2、我们在编写java代码的时候一般会经过先编译,再运行的过程,但是这就会导致一个问题,那就是使用new 方式只能够静态的加载,这样就会有一个弊端,那就是假如说我有N个类,但是中间只有一个是错误的,或者说没有这个类,那么采用new方式就不能编译通过,那么我所有的类都将不能正常的使用,这就不好了。所以可以采用反射机制,进行动态的加载我们所需要的类,这样就不会出现我们遇到这种情况了。那就是Class c=Class.forName(“类的全名”);然后进行强制的类型(前提是这个类型是我们要用的类的implements的共同遵守的一个标准,这也为今后的功能添加,子类添加奠定了基础)转换即可。

3、对于成员变量,其实它(们)也是对象,万事万物在java中全是对象,至于成员变量就是Field的对象,我们可以使用
Class c=c.class;
Field[] fields=c.getDeclaredFields();
field.getName(),field.getType();
就可以了。

4、对于成员函数,其实它也是对象。我们可以使用
Class c=obj,getClass();
c.getDeclaredMethods();

5、小总结:只要想获取类信息,就要获得类类型如,Class c=object.getClass();

6、方法的获得:思路就是,要是获得某个方法的具体的信息,就要先获取该方法所在的类的类类型,然后使用method.invoke,由此可以获得方法的具体信息了。
Class c=object.getClass();
c.getMethod(name,params);//只是public 方法,也可以使用getDeclaredMethods();
例如,我们有一个叫print的方法,里面有两个int int参数,
就可以如下写:Method method=c.getDeclaredMethods(“print”,new Class[]{int.class,int.class});
或者:
method=c.getDeclaredMethods(“print”,int.class,int.class);//有几个参数就写几个参数,这样也是可以的。
方法反射调用函数的方式就是使用method来进行操作的
当有返回值的时候,Object object=method.invoke(obj,params);//效果和obj.print(10,12);效果是一样的。没有返回值时,返回null;
其中参数obj就是我们要反射的类的实例,是不是并不是那么难啊。

最后一个知识点就是反射操作和泛型的操作是绕过编译阶段的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值