码迷,mamicode.com
首页 > 编程语言 > 详细

Java反射机制

时间:2015-04-03 17:29:53      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

0、Java反射机制的定义:
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
1、反射机制的作用:
1)在运行中分析类的能力
2)在运行中查看对象
3)实现通用的数组操作代码
4)利用Method对象(这个对象很想C++中的函数指针)
5)希望提供在跨网络的远程平台上创建和运行对象的能力,即远程方法调用(RMI),允许Java程序将对象分布到多台机器上。
2、利用反射实现一般的toString()方法

    public String toString(Object obj) {

        if (obj == null)

            return"null";

        if (visited.contains(obj))

            return"...";

        visited.add(obj);

        Class<?> cl = obj.getClass();

        //如果是String类型,直接返回

        if (cl == String.class)

            return (String) obj;

        //如果是数组类型

        if (cl.isArray()) {

            String r = cl.getComponentType() + "[]{";//返回表示Array数组组件繁的类型

            for (inti = 0; i < Array.getLength(obj); i++) {

                if (i > 0)

                    r += ",";

                Object val = Array.get(obj, i);

                if (cl.getComponentType().isPrimitive())//判定Class对象是否是基本类型

                    r += val;

                else

                    r += toString(val);//应用类型的话重复调用toString

            }

            return r + "}";

        }

 

        String r = cl.getName();

        do {

            r += "[";

            Field[] fields = cl.getDeclaredFields();

            AccessibleObject.setAccessible(fields, true);//设置域可访问

            // get the names and values of all fields

            for (Fieldf : fields) {

                if (!Modifier.isStatic(f.getModifiers())) {

                    if (!r.endsWith("["))

                        r += ",";

                    r += f.getName() + "=";

                    try {

                        //获取FieldValue的标准方法

                        Class<?> t = f.getType();

                        Object val = f.get(obj);

                        if (t.isPrimitive())

                            r += val;

                        else

                            r += toString(val);

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

            }

            r += "]";

            cl = cl.getSuperclass();//还要遍历其超类

        } while (cl != null);

 

        return r;

    }


3、使用Method对象来实现C语言中的函数指针的所有操作。

4、继承中的反射

class Am

{   

} 

class Bm extends Am

{   

} 


public class Main { 

   public static void main(String[] args) {       

        Am a = new Bm();

        System.out.println(a.getClass()); //输出结果为class test.Bm,即运行时类型为Bm     

    }

}


4、RTTI:(Run-Time Type Information,通过运行时类型信息)程序能够使用基类指针或引用来检查这些指针或引用所指的对象的实际派生类型。

    1.  传统的RTTI:编译时类型;
    2.“反射机制”:运行时发现和使用类的信息
1)  Java使用Class对象来执行RTTI,每个类都有一个Class对象,使用JVM中的类加载器子系统;类加载器首先检查这个类的Class对象是否已加载,如果尚未加载,默认的类加载器就会根据类名查找.class文件

5、类字面常量

例:FancyToy.class ,相较于forName()方法更安全,因为其在编译时就会受到检查(故而不用像forName()一样置于try语句中);

1.类字面常量同时可以应用于接口、数组、以及基本数据类型中;如boolean.class = Boolean.TYPE

2.使用类字面常量时,不会自动初始化该Class对象,而是执行了加载、链接、初始化三个准备步骤;初始化被延迟到首次引用静态方法(构造器也是静态的)或非常数静态域(调用常数并不会对类进行初始化)时才执行;

   而相对应的使用Class.forName()立即就进行了初始化。


6、泛型的Class引用

1.引入泛型,对Class引用所指向的Class对象的类型进行限定

    Class<Integer> class1 = int.class;

    //int a;

    //class1 = a.getClass();//基本类型不能存在getClass函数

    Integer mInteger = null;

    class1 = (Class<Integer>) mInteger.getClass();//getClass要注意加上强制转换

    //Double mDouble;

    //class1 = mDouble.getClass();//无法编译通过

    //class1 = double.class;//类型不匹配,无法编译通过

2.Class<?>优于平凡的Class,即是它们其实是等价的

3.使用通配符?创建一个范围

    Class<? extends Number> class2 = int.class;

    Class<? super Integer> class1 = int.class;

4.创建对象使用class1.newInstance();

5.使用泛型和平凡Class,创建对象的区别;泛型会返回该对象的确切类型,而Class只能返回基本的Object

    Classclass1 = int.class;

    intm = (int) class1.newInstance();

    Class<Integer> class2 = int.class;

    intp = class2.newInstance();

6.使用cast()进行转型

7、RTTI形式包括:
1.传统的类型转化(如“Shape”)
2.代表对象类型的Class对象,通过查询Class对象获取运行时所需的信息
3.instacnce of,(替代方法:Class.isInstance方法提供了一种动态测试对象的途径)

    intm = 0;

    Class<Integer> class1 = int.class;

    class1.isInstance(m);


8、类方法提取器
Class类与java.lang.reflect类库(Field,Method,Constructor类)一起对反射的概念进行了支持。
   getFields,getMethods,getConstructors返回类提供的public域、方法和构造器
   getDeclareFields,getDeclareMethods,getDeclaredConstructors返回生命的全部域、方法和构造器






















Java反射机制

标签:

原文地址:http://blog.csdn.net/woliuyunyicai/article/details/44856361

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!