获取类的class文件对象的三种方式
Test.java -> Test.class(编译器编译) -> 在内存中运行(类加载器) -> 字节码对象(Class对象)
一个java文件 在内存中只有一个class文件对象
/** 对象获取* 类名获取* Class类的静态方法获取*/public class ReflectTest { public static void main(String[] args)throws ClassNotFoundException { //对象获取 Test test= new Test(); //调用Test类的父类的方法 getClass Class c1 = p.getClass(); System.out.println(c1); //类名获取 //所有类型 基本和引用 都有静态的属性 属性名字class Class c2 = Test.class; System.out.println(c2); //Class类的静态方法获取 forName(字符串的类名)包名.类名 Class c3 = Class.forName("Test"); System.out.println(c3); }}
Java反射 动态运行
/** 准备配置文件 键值对* IO流读取配置文件 Reader* 文件中的键值对存储到集合中 Properties* 集合保存的键值对 就是类名和方法名* 反射获取指定类的class文件对象* class文件对象,获取指定的方法*/public class Test { public static void main(String[] args) throws Exception{ //IO流读取配置文件 FileReader r = new FileReader("config.properties"); //创建集合对象 Properties pro = new Properties(); //调用集合方法load 传递流对象 pro.load(r); r.close(); //通过键获取值 String className = pro.getProperty("className"); String methodName = pro.getProperty("methodName"); //反射获取指定类的class文件对象 Class c = Class.forName(className); //创建对象 Object obj = c.newInstance(); //获取指定的方法名 Method method = c.getMethod(methodName); //运行获得的此方法 method.invoke(obj); }}
// reflect api 拥有可以获取private成员变量和private的函数的方法 但并不建议使用 getName() 获得类的完整名字 getFields() 获得类的public类型的属性 getDeclaredFields() 获得类的所有属性 包括private 声明的和继承类 getMethods() 获得类的public类型的方法 getDeclaredMethods() 获得类的所有方法 包括private 声明的和继承类 getMethod(String name, Class[] parameterTypes) 获得类的特定方法 name参数指定方法的名字 parameterTypes 参数指定方法的参数类型 getConstructors() 获得类的public类型的构造方法 getConstructor(Class[] parameterTypes) 获得类的特定构造方法 parameterTypes 参数指定构造方法的参数类型 newInstance() 通过类的不带参数的构造方法创建这个类的一个对象