版权声明:本文为setlilei原创文章 未经博主允许不得转载 https://blog.csdn.net/setlilei/article/details/84675469
获取类的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() 通过类的不带参数的构造方法创建这个类的一个对象