Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26278390
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2010-05-04 20:38:37

Java中的reflect

此文算是学习整理Java中的反射专题之用。待晚上详细阅读JAVA思想中的反射一章

Reflection Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说自审,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。

Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,PascalC 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。

JavaBean reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件() 的属性。

心得:运行中的JAVA程序能够自检。

示例1.

public class Test {

    public static void main(String[] args) {

        try {

            Class c = Class.forName(args[0]);

            Method m[] = c.getDeclaredMethods();

            for (int i = 0; i < m.length; i++) {

                System.out.println(m[i].toString());

            }

        } catch (ClassNotFoundException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

       

    }

}

输出这个类里面的声明方法列表!

 

二、使用反映的步骤

2.1 获得一个class对象

Class c = Class.forName(“java.lang.String”);

2.2 调用诸如getDeclaredMethods()方法获取此类里面的方法列表

Method m[]= c.getDeclaredMethods();

2.3 调用反射的相关API操作

System.out.println(m[0]);

模拟 instanceof 操作符

得到类信息之后,通常下一个步骤就是解决关于 Class 对象的一些基本的问题。例如,Class.isInstance 方法可以用于模拟 instanceof 操作符:

class A {
}

public class instance1 {
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("A");//
拿到一个类
            boolean b1 = cls.isInstance(new Integer(37));//
模拟instanceof
            System.out.println(b1);
            boolean b2 = cls.isInstance(new A());
            System.out.println(b2);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}

 

获取有关构造函数的方法

public class Test {

    private String a;

    public Test() {

        // TODO Auto-generated constructor stub

    }

    protected  Test(int i,double d) {

       

    }

    public static void main(String[] args) {

        try {

            Class c = Class.forName("cn.ty.Test");

            Constructor ctorlist[] = c.getConstructors();

            for (int i = 0; i < ctorlist.length; i++) {

                Constructor ct = ctorlist[i];

                System.out.println("name = " + ct.getName());

                System.out.println("declass:"+ct.getDeclaringClass());

                Class pvev[] = ct.getParameterTypes();

                for (int j = 0; j < pvev.length; j++) {

                    System.out.println("param # "+j+" "+pvev[j]);

                }

                Class evec[] = ct.getExceptionTypes();

                for (int j = 0; j < evec.length; j++) {

                    System.out.println("exc #" + j+ " " + evec[j]);

                }

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

            }

        } catch (ClassNotFoundException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

       

    }

}

这个类可以实现自检操作。即检查自身的相关属性!

 

 

阅读(787) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~