A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 飞逸 黑马帝   /  2011-12-14 17:12  /  2738 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

刚刚接触反射 不知道他的作用和价值在以后的代码中的体现??  求解。。。

4 个回复

正序浏览
            反射是java一个关键性质,允许程序在运行时透过反射加载任何一个已知名称的class的内部信息,对于任意一个类,都能够知道这个类的所有属性和方法。包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现interfaces(例如Serializable),并可于运行时改变fields内容或调用methods。
         通俗的说,反射其实也就是程序能够自检查自身信息,就像程序会照镜子反光看自己。在程序中可以检查某个类中的方法属性等信息,并且能够动态调用。这样可以写出很灵活的程序。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
任涛 黑马帝 2011-12-15 11:24:02
板凳
1.JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。
2.Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
反射就是:在任意一个方法里:
1.如果我知道一个类的名称/或者它的一个实例对象, 我就能把这个类的所有方法和变量的信息找出来(方法名,变量名,方法,修饰符,类型,方法参数等等所有信息)。
2.如果我还明确知道这个类里某个变量的名称,我还能得到这个变量当前的值。
2.当然,如果我明确知道这个类里的某个方法名+参数个数类型,我还能通过传递参数来运行那个类里的那个方法。

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
吴上储 + 1
飞逸 + 2 赞一个!

查看全部评分

回复 使用道具 举报
祁焱 黑马帝 2011-12-14 17:19:50
沙发
反射的一个简单应用:
是一个类的查看器,通过这个查看器可以简单地实现取得类的基本信息:
import java.lang.reflect.*;

public class SimpleClassViewer {
     public static void main(String[] args) {
        try {
            Class c = Class.forName(args[0]);
            // 取得包代表对象
            Package p = c.getPackage();
            
            System.out.printf("package %s;%n", p.getName());
            
            // 取得类型修饰,像是class、interface
            int m = c.getModifiers();
            
            System.out.print(Modifier.toString(m) + " ");
            // 如果是接口
            if(Modifier.isInterface(m)) {
                System.out.print("interface ");
            }
            else {
                System.out.print("class ");
            }
            
            System.out.println(c.getName() + " {");

            // 取得声明的域成员代表对象
            Field[] fields = c.getDeclaredFields();
            for(Field field : fields) {
                // 显示权限修饰,像是public、protected、private
                System.out.print("\t" +
                    Modifier.toString(field.getModifiers()));
                // 显示类型名称
                System.out.print(" " +
                    field.getType().getName() + " ");
                // 显示域成员名称
                System.out.println(field.getName() + ";");
            }

            // 取得声明的构造函数代表对象            
            Constructor[] constructors =
                            c.getDeclaredConstructors();
            for(Constructor constructor : constructors) {
                // 显示权限修饰,像是public、protected、private
                System.out.print("\t" +
                     Modifier.toString(
                       constructor.getModifiers()));
                // 显示构造函数名称
                System.out.println(" " +
                      constructor.getName() + "();");
            }
            // 取得声明的方法成员代表对象            
            Method[] methods = c.getDeclaredMethods();
            for(Method method : methods) {
                // 显示权限修饰,像是public、protected、private
                System.out.print("\t" +
                     Modifier.toString(
                              method.getModifiers()));
                // 显示返回值类型名称
                System.out.print(" " +
                     method.getReturnType().getName() + " ");
                // 显示方法名称
                System.out.println(method.getName() + "();");
            }
            System.out.println("}");
        }
        catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("没有指定类");
        }
        catch(ClassNotFoundException e) {
            System.out.println("找不到指定类");
        }
    }
}

这段代码在五期的论坛上我曾经发过,反射还有许多其它方面的应用,张老师讲代理和spring框架的时候也有反射的应用。

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
吴上储 + 1
飞逸 + 2 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马