java反射机制

       这几天初步学习了java反射,感觉到在java中“万事万物皆对象”的真理。不管是类,接口,成员变量,方法和构造函数等都是基于对象的。下面将解释其原因:

       将从获取相应的信息过程解释java中“万事万物皆对象”。怎样获取,接口,成员变量,方法和构造函数等的信息呢?我将一一解决相应得问题。

     1、类是java.lang.Class类的实例对象,(将类对象的类简称于类类型)

           解释说明:Class类是静态类,仅能jvm创建,隐含一个静态内部成员变量

         将类转化为类类型的对象。主要有以下三种:


             第一种:我们想实例一个类的对象,同过对象转化器对应的类类型。

                // 创建Foo的类对象
Foo foo = new Foo();

                //通过对象的getClass方法转化为类类型

               Class c= foo.getClass();  

    

            第二种:直接通过类转化为对应的类类型。

              // 将Foo类转化为Class类类型

              Class c1 = Foo.class;



             第三种:同过Class的forClass()方法转化为类类型。

                                      

                                       //"com.example.reflect.Foo“为全类名(包名 + 类名)

               c3 = Class.forName("com.example.reflect.Foo");


       通过以上三种方法可以将类转化为类类型(注:forClass()为动态加载),c.getName()可以获得相应类的类型。 这样就能获得类的简单信息,同时也为获取方法,成员变量等信息打下基础。



               2、成员变量也是对象,是 java.lang.reflect.Filed的对象

               //得到相应类对象的类类型
Class c = object.getClass();

//c.getFields();该方法获得该类类性自己成名的public的成员变量信息
//获得自己声明的所有成员变量的信息
Field[]files =c.getDeclaredFields();

//打印成员变量的信息
for (Field field : files) {
//获得成员变量的类型的类类型
Class filedType = field.getType();
//得到成员变量的封装类型
String typeName = filedType.getName();

//得到成员变量的名称
String filedName = field.getName();

System.out.println(typeName + " " + filedName);


}


       3、方法也是对象,是 java.lang.reflect.Method的对象

          Class c = object.getClass();//转化为相应类型的类类型

System.out.println("该类的类型为:" + c.getName());//获取该对象的类型

/*
* Method类型,
* getMethod 获得方法对象所欲的public方法,包括继承父类的pubic方法

* */

//得到所有的方法
Method []methods = c.getMethods();
//c.getDeclaredMethods();该方法访问该类自己的所有方法,不能访问父类继承的方法,没有修饰符限制
for (Method method : methods) {
Class re = method.getReturnType();//获得放回值的类类性
System.out.print(re.getName() + " ");
System.out.print(method.getName() + " (");

//得到方法的参数类型
Class []parames =  method.getParameterTypes();
for (Class parame : parames) {
System.out.print(parame.getName() + ",");

}
System.out.println(")");
}



         4、构造函数也是对象,是java.lang.Constructor的对象

           //得到相应类对象的类类型
Class c = object.getClass();

//c.getConstructors();该方法获得该对象自己修订的public构造方法

//获得自己声明的所有构造函数的信息
Constructor []constructors = c.getDeclaredConstructors();


for (Constructor constructor : constructors) {



//获取构造函数的名称
String conName = constructor.getName();
System.out.print(conName + "(");

//获得构造函数的参数类型
Class []parames = constructor.getParameterTypes();

for (Class class1 : parames) {
System.out.print(class1.getName() + ",");

}
System.out.println(")");



}

            通过以上的方式我们得到了类,成员变量,方法和构造函数的信息。同类似的方法可以得到java其他的相应信息。这就不一一展示了。下面将简单介绍我们平时使用平凡的方法的反射:

        //实例 MethodReflect 的对象

       注: MethodReflect类中重载print方法,分别是无参和两种不同形参。

        MethodReflect mReflect = new MethodReflect();
//获取MethodReflect类的信息
Class c =mReflect.getClass();



try {
//获取该类的public修饰的方法方法
Method m = c.getMethod("print");
//反射该类的方法
m.invoke(mReflect);
//获取该类的public修饰的方法方法
Method m1 = c.getMethod("print", int.class,int.class);
//反射该类的方法
m1.invoke(mReflect, 10,20);
Method m2 = c.getMethod("print", String.class,String.class);
m2.invoke(mReflect, "HELLO","world");

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


    最后解释说明以下,以上内容是由个人从慕课网所学的心得,如有错误的请指出,本人将非常感激。同时如想了解更详细的知识可以去慕课网。

        

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值