标签:
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