Java反射-reflect

版权声明:本文为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() 通过类的不带参数的构造方法创建这个类的一个对象

猜你喜欢

转载自blog.csdn.net/setlilei/article/details/84675469