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

黑马程序员-java基础-反射

时间:2015-09-01 21:26:57      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

java.lang.Class类的实例代表java应用程序运行时加载的.class文档。
    其构造函数:
        private Class() {}
    说明我们无法创建Class对象,Class对象是有JVM自动产生,每个.class文档加载后,JVM会自动生成对应的Class对象。
    
 
什么时候加载.class文件进内存
    1,用Class.forName()或者类加载器(Class claz = fu.class 没有执行static{}块??)
    2,用 new 生成对象时
注意:用类声明参考名称并不会加载.class文件(String str;不会加载一样),只检查对应的.class文档是否存在,只有用new生成对象时,才会加载类
 
  forName(String name)方法
        其中,name是一个类的完整类名,用于将该类的.class文件加载进内存,并创建相应的Class对象    
 
 
Class常用方法
    getField():返回Public类型的字段
    getDeclaredField():返回任意类型(包括private)的字段
 
    getMethod(String name,Class<?> ... parameter)
    getDeclaredMethod(String name,Class<?> ... parameter)
 
    getConstructor(Class<?> ... params)
    getDeclaredConstructor(Class<?> ... params)
 
Field:表示Class中的字段
    Field常用方法
        getName()  返回字段的名称
        getType()  返回声明类型的Class对象
        isAccessible():判断该字段是否能够进行访问
        setAccessible():让其可以进行访问       
 
Method:代表一个类中的成员方法
        getReturnType()   返回Method对象代表对象的返回类型
        Object invoke(Object,Object... paras)
            如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null.
            如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
 
Constructor:代表某个类的构造方法
        newInstance(Object... params):

关于getResourceAsStream()
    一个类加载器能加载.class文件,那它当然也能加载classpath环境下的其他文件,既然它有如此能力,它没有理由不顺带提供这样一个方法。它也只能加载classpath环境下的那些文件。
    注意:直接使用类加载器时,不能以/打头。
     加载某个包下的文件:

                InputStream ips = ReflectTest2.class.getClassLoader().getResourceAsStream("cn/itcast/javaenhance/config.properties");

           加载bin根路径的文件

                    InputStream ips = ReflectTest2.class.getClassLoader().getResourceAsStream("config.properties");

        Class提供了一个便利方法,用加载当前类的那个类加载器去加载相同包目录下的文件

 

                InputStream ips = ReflectTest2.class.getResourceAsStream("config.properties");

            加载bin根路径的文件

                InputStream ips = ReflectTest2.class.getResourceAsStream("/config.properties");


 

 

关于利用反射执行main函数的问题

    public static void main(String[] args),可以看出main函数的参数是数组
    Method类中的invoke方法为:
        jdk1.5   invoke(name,Object... params)
        jdk1.4   invoke(name,Object[] params)
    如果在invoke中传入数组,则数组第一个元素对应Strirng[] agrs.
 
    可以这样写: invoke(name,new Object[]{new String[]{"xxx"}});

 

 

 


    
 
 
 
 
 
    

黑马程序员-java基础-反射

标签:

原文地址:http://www.cnblogs.com/wuxiaodong/p/4776746.html

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