目录
一、关于Class类
1、类的加载过程:
程序经过javac.exe-->生成一个或多个字节码文件(.class结尾)-->java.exe命令对某个字节码文件及逆行解释运行,相当于将该字节码文件加载到内存中
加载到内存中的类,就是运行时类,这个运行时类,就是Class的一个实例。
2、Class实例就对应着一个运行类
3、加载到内存中的运行时类,会缓存一定的时间,我们可通过不同的方式来获取此运行时类
获取Class类的实例 :
//Person是自定义的类
//方式一:调用运行时类的属性 .class
Class clazz1 = Person.class;
//方式二:通过运行时类的对象,调用getClass()
Person p1 = new Person();
Class clazz2 = p1.getClass();
//方式三:调用Class的静态方法:forName(String classPath)
Class clazz3 = Class.forName("test.Person");
System.out.println(clazz1 == clazz2); //true
System.out.println(clazz1 == clazz3); //true
二、使用ClassLoader加载配置文件
@Test
public void test3() throws IOException {
Properties pros = new Properties();
//读取配置文件 方式一: 此时的文件默认在当前的module下
//FileInputStream fis = new FileInputStream("jdbc.properties");
//pros.load(fis);
//读取配置文件 方式二: 使用当前类的ClassLoader 配置文件默认识别为当前module的src下
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("jdbc1.properties");
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
System.out.println("user="+user+",password="+password);
}
三、创建运行时类的对象
clazz.newInstance();方法过时 --> clazz.getDeclaredConstructor().newInstance();
//Person是一个类
Class<Person> clazz = Person.class;
//clazz.newInstance()方法过时-->replaced by--> clazz.getDeclaredConstructor().newInstance()
Person person = clazz.getDeclaredConstructor().newInstance();
System.out.println(person);
四、获取指定的属性、方法和构造器
1、获取指定的属性:
//Person是自定义的类
Class<Person> clazz = Person.class;
//1、创建运行时类的对象
Person p = clazz.getDeclaredConstructor().newInstance();
//2、获取指定的属性 getDeclaredField(String fieldName):获取指定变量名的属性
Field name = clazz.getDeclaredField("name");
//3、setAccessible(true):保证当前属性是可访问的
name.setAccessible(true);
//4、设置指定对象的此属性值
name.set(p,"harry");
System.out.println(name.get(p));
2、获取指定的方法
Class<Person> clazz = Person.class;
//1、创建运行时类的对象
Person p = clazz.getDeclaredConstructor().newInstance();
//2、获取指定的方法 getDeclaredMethod(参数一,参数二) 参数一:指明要获取的方法的名称,参数二:指明获取方法的形参列表
Method show = clazz.getDeclaredMethod("show", String.class);
//3、setAccessible(true):保证当前属性是可访问的
show.setAccessible(true);
//3、调用该方法
//invoke(参数1,参数2) 参数1:方法的调用者 参数2:给方法形参赋值的实参 ;
//show.invoke(p,"china");
String str = (String) show.invoke(p,"china"); //获取show()方法中的返回值
System.out.println(str);
//如果调用的运行时类中的方法没有返回值,则此invoke()返回值为null 这里shows()方法在Person类中修饰为static
Method shows = clazz.getDeclaredMethod("shows");
shows.setAccessible(true); //保证盖方法是可访问的
Object returnValue = shows.invoke(Person.class); //无形参列表,则只传递对象
3、获取指定的构造器
Class<Person> clazz = Person.class;
//1、获取指定的构造器 getDeclaredConstructor(参数1) 参数1:指明构造器的参数列表
Constructor<Person> declaredConstructor = clazz.getDeclaredConstructor(String.class);
//2、保证此构造器是可访问
declaredConstructor.setAccessible(true);
//3、调用此构造器创建运行时类的对象
Person person = declaredConstructor.newInstance("Jerry");
本文详细介绍了Java反射机制的基础概念,包括Class类的作用、如何通过不同方式获取Class实例、使用ClassLoader加载配置文件的方法、如何利用反射创建对象以及如何通过反射获取指定的属性、方法和构造器。
2005

被折叠的 条评论
为什么被折叠?



