Java基础---反射

https://blog.csdn.net/sinat_38259539/article/details/71799078

说明:使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)

1、即使一个类处于运行状态,也能够知道这个类的所有属性和方法 ; 对于任意一个对象,都能够调用他的任意一个方法和属性(使用Invoke调用方法) ;

2、获取class对象的三种方式

package fanshe;
/**
 * 获取Class对象的三种方式
 * 1 Object ——> getClass();
 * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
 * 3 通过Class类的静态方法:forName(String  className)(常用)
 *
 */
public class Fanshe {
	public static void main(String[] args) {
		//第一种方式获取Class对象  
		Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
		Class stuClass = stu1.getClass();//获取Class对象
		System.out.println(stuClass.getName());
		
		//第二种方式获取Class对象
		Class stuClass2 = Student.class;
		System.out.println(stuClass == stuClass2);//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
		
		//第三种方式获取Class对象
		try {
			Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
			System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

3、通过反射获取指定类的属性、调用指定方法

class JdbcTemplate{
	private String datasource;
	public void setDatasource(String datasource) {
		System.out.println("==set==");
		this.datasource = datasource;
	}
	public String getDatasource() {
		return datasource;
	}
}
public class TestReflect01 {
	public static void main(String[] args) throws Exception{
		//获取class对象
		Class<?> c = Class.forName("reflect.JdbcTemplate");
		//构建类的对象
		Object obj = c.newInstance();

		//获取指定名字的属性
		Field f = c.getDeclaredField("datasource");
		System.out.println("f.type" + f.getType().getName());

		//基于属性对象找到对应的set方法
		//参数:(方法名称,参数类型)
		Method m = c.getDeclaredMethod("setDatasource", f.getType());
		//Method类的invoke方法 ; invoke(Object obj , Object param[])
		m.invoke(obj,"oracle......");
	}
}

猜你喜欢

转载自blog.csdn.net/qq_24271537/article/details/81451568