1-对"反射"的理解:
/*
反射 --> "大鱼吃小鱼的原理"
解释:
我们之前说,定义一个类,后可以分为private、public这些状态,可是我们用"反射"就相当于"有一个大的.Class把小.class吃掉了"
那大鱼就可以使用小鱼肚子里面的任何"私有"方法。
*/
2- 获取Class的实例:
换句话说:Class的实例就对应这一个运行时类,加载到内存中的运行时类,会缓存一定的时间。在此时间内,我们可以通过不同的方式(下面有3种,可以参考)来获取此运行时类
下面的person类的代码块
package _366After.src.javeTeacher.reflect.reflectionTest;
/*
给--reflection--来演示"大鱼吃小鱼"
*/
public class Person {
private String name;
private String sex;
private Integer age;
public Person() {
}
public Person(String name, String sex, Integer age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
主代码块
public void test1() throws ClassNotFoundException {
//方法一:调用运行时的属性
Class<Person> classzz1 = Person.class;
System.out.println(classzz1);
//2- 方式二:运行时类的对象,调用getClass
Person classzz2 = new Person();
Class<? extends Person> aClass = classzz2.getClass();
System.out.println(aClass);
//3-调用Class的静态方法:forName(String classPath)
// ----- > 这里有小技巧,我选择的"自定义类--person",这里的路径,我双击点person,任何选择 - Copy-Reference(自己写的话,可以回报-找不到的错误)
Class<?> aClass1 = Class.forName("src/_366After/src/javeTeacher/reflect/reflectionTest/Person.java");
System.out.println(aClass1);
}
3- 附加(对-配置文件的读取)
//2- 读取配置文件
@Test
public void test2() throws Exception {
Properties properties = new Properties();
//1-方式一:(读取当前module下的配置文件)
FileInputStream fileInputStream = new FileInputStream("jdbc.properties");
properties.load(fileInputStream);
//方式二:(当前modv ule下的src的配置文件)
ClassLoader classLoader = ClassLoader.class.getClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream("jdbk1.properties");
properties.load(resourceAsStream);
}
}