Java Reflection反射

使用反射的原因是动态规划,在实际开发过程中我们读取进来一个类,但是我们可能只知道描述类的一串字符串,这个时候我们可以使用反射来动态创建我们类的实例

Java Reflection
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期 借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法

1、什么时候要用反射?
反射的动态性,比如后台运行的时候前端发信息来,我们做对应的操作都需要反射
2、反射机制和面向的对象的封装性是否矛盾
不矛盾

//1、通过反射创建Person对象
Class clazz = Person.class;
Constructor con = clazz.getConstructor(String.class,int.class);

Object tom = con.newInstance(“Tom”, 12);
Person p = (Person) tom;
System.out.println(p);

//2、通过反射调用对象指定的属性方法
//调用属性
Field age = clazz.getDeclaredField(“age”);
age.set(p,10);
System.out.println(p);

//调用方法
Method show = clazz.getDeclaredMethod(“show”);
show.invoke(p);

//通过反射调用Person类的私有结构 比如:私有构造器、方法、属性
Constructor con1 = clazz.getDeclaredConstructor(String.class);
con1.setAccessible(true);
Person p1 = (Person) con1.newInstance(“Jarry”);
System.out.println(p1);

//调用私有的属性
Field name = clazz.getDeclaredField(“name”);
name.setAccessible(true);
name.set(p1,”Hanmeimei”);
System.out.println(p1);

//1.获取一个系统类加载器
ClassLoader classloader = ClassLoader.getSystemClassLoader();
System.out.println(classloader);
//2.获取系统类加载器的父类加载器,即扩展类加载器
classloader = classloader.getParent();
System.out.println(classloader);
//3.获取扩展类加载器的父类加载器,即引导类加载器 (无法获取,主要加载Java核心类库,无法加载自定义类)
classloader = classloader.getParent();
System.out.println(classloader);
//4.测试当前类由哪个类加载器进行加载
classloader = Class.forName(“exer2.ClassloaderDemo”).getClassLoader();
System.out.println(classloader);

创建一个运行时对象:
Class clazz = Person.class;

//newInstance():此方法创建对应的运行时类的对象,调用了运行时类的空参构造器

/*
要求:
1、运行时类必须提供空参的构造器
2、空参的构造器访问权限要够,通常设置为public

Javabean中要求提供一个public的空参构造器原因:
1、在于方便通过反射,创建运行时类的对象
2、便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器

*/
Person o = clazz.newInstance();

运用反射打开配置文件properties
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream(“JDBC.properties”);

Properties properties = new Properties();
properties.load(inputStream);

String user = properties.getProperty(“user”);
String password = properties.getProperty(“password”);
String url = properties.getProperty(“url”);
String driverClass = properties.getProperty(“driverClass”);