黑马程序员技术交流社区

标题: 黑马程序员 关于java反射里基本方法怎么用啊?我是在不理解,求教! [打印本页]

作者: 北极雪871208    时间: 2014-3-28 10:27
标题: 黑马程序员 关于java反射里基本方法怎么用啊?我是在不理解,求教!
---------------------- <a target="blank">ASP.Net+Unity开发</a>、<a target="blank">.Net培训</a>、期待与您交流! ----------------------
什么创建类,方法等,看到这里实在看不懂了~~~哪位大神给说说用法啊!谢了!!!!!

---------------------- <a target="blank">ASP.Net+Unity开发</a>、<a target="blank">.Net培训</a>、期待与您交流! ----------------------

作者: 董振冬    时间: 2014-3-30 10:53
我昨天正好在复习这个
首先jvm将对应的类的class文件加载进来,这就是类加载。

                                                  类对象:类加载完以后,jvm会把类信息封装在一个对象中。这封装了类信息的对象就是类对象

                                                               首次使用某个类的时候才会发生类加载!声明一个类的引用时不会产生类加载,只会在栈中为引用声明四个字节。

                                                               封装:jvm会把类对象中的每一个字段封装成filed对象

                                                                        把每一个构造函数封装成Constructor对象

                                                                          把每一个方法封装成Method对象,

                                                                          这些对象一同封装成类对象;

                                          获取类对象的三种方法:   类名.class    对象.getClass   Class.forName(类名字符串)      

                                            获取类对象以后,继而获取其他三个对象,Method对象,Constructor对象,filed对象;
通过这三个对象,获取对应的方法。


作者: 董振冬    时间: 2014-3-30 12:07
然后给你一个综合点的代码
public class RefConstructor {



    public static void main(String args[]) throws Exception {

        RefConstructor ref = new RefConstructor();

        ref.getConstructor();



    }



    public void getConstructor() throws Exception {

        Class c = null;

        c = Class.forName("java.lang.Long");

        Class cs[] = {java.lang.String.class};



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



        Constructor cst1 = c.getConstructor(cs);

        System.out.println("1、通过参数获取指定Class对象的构造方法:");

        System.out.println(cst1.toString());



        Constructor cst2 = c.getDeclaredConstructor(cs);

        System.out.println("2、通过参数获取指定Class对象所表示的类或接口的构造方法:");

        System.out.println(cst2.toString());



        Constructor cst3 = c.getEnclosingConstructor();

        System.out.println("3、获取本地或匿名类Constructor 对象,它表示基础类的立即封闭构造方法。");

        if (cst3 != null) System.out.println(cst3.toString());

        else System.out.println("-- 没有获取到任何构造方法!");



        Constructor[] csts = c.getConstructors();

        System.out.println("4、获取指定Class对象的所有构造方法:");

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

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

        }



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



        Type types1[] = c.getGenericInterfaces();

        System.out.println("1、返回直接实现的接口:");

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

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

        }



        Type type1 = c.getGenericSuperclass();

        System.out.println("2、返回直接超类:");

        System.out.println(type1.toString());



        Class[] cis = c.getClasses();

        System.out.println("3、返回超类和所有实现的接口:");

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

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

        }



        Class cs1[] = c.getInterfaces();

        System.out.println("4、实现的接口");

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

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

        }



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



        Field fs1[] = c.getFields();

        System.out.println("1、类或接口的所有可访问公共字段:");

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

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

        }



        Field f1 = c.getField("MIN_VALUE");

        System.out.println("2、类或接口的指定已声明指定公共成员字段:");

        System.out.println(f1.toString());



        Field fs2[] = c.getDeclaredFields();

        System.out.println("3、类或接口所声明的所有字段:");

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

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

        }



        Field f2 = c.getDeclaredField("serialVersionUID");

        System.out.println("4、类或接口的指定已声明指定字段:");

        System.out.println(f2.toString());



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



        Method m1[] = c.getMethods();

        System.out.println("1、返回类所有的公共成员方法:");

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

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

        }



        Method m2 = c.getMethod("longValue", new Class[]{});

        System.out.println("2、返回指定公共成员方法:");

        System.out.println(m2.toString());



    }

}

输出结果:输出结果很长,这里不再给出。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2