软件设计之Java入门视频(21)
视频教程来自B站尚硅谷:
尚硅谷Java入门视频教程,宋红康java基础视频
相关文件资料(百度网盘)
提取密码:8op3
idea 下载可以关注 软件管家 公众号
学习内容:
该视频共分为1-717部分
本次内容涉及 630-659
在写代码时,总是需要来回切换界面来看代码要求,这里推荐Snipaste,可以把截图以窗口形式放在屏幕上
记录内容:
- 动态语言与静态语言
- Java反射机制
1、 动态语言与静态语言
Java反射机制
概述
反射前后使用对比
public class ReflectionTest {
//反射之前,对Person的操作
@Test
public void test1(){
//1.创建Person类的对象
Person p1 = new Person("Tom",12);
//2.通过对象,调用其内部的属性与方法
p1.age = 10;
System.out.println(p1.toString());
p1.show();
//在Person类的外部,不可以通过Person类的对象调用其内部私有结构
//比如:私有的name、showNation()、构造器
}
//反射之后,对Person的操作
@Test
public void test2() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
Class clazz = Person.class;
//1.通过反射,创建Person类的对象
Constructor cons = clazz.getConstructor(String.class,int.class);
Object obj = cons.newInstance("Tom",12);
Person p = (Person)obj;
System.out.println(p.toString());//Person{name='Tom', age=12}
//2.通过反射,调用对象指定的属性与方法
//调用属性
Field age = clazz.getDeclaredField("age");
age.set(p,10);
System.out.println(p.toString());//Person{name='Tom', age=10}
//调用方法
Method show = clazz.getDeclaredMethod("show");
show.invoke(p);//你好,我是人
//通过反射,可以调用Person类的私有结构
Constructor con1 = clazz.getDeclaredConstructor(String.class);
con1.setAccessible(true);
Person p1 = (Person) con1.newInstance("Jerry");
System.out.println(p1);//Person{name='Jerry', age=0}
//调用私有的属性
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p1,"Han");
System.out.println(p1);//Person{name='Han', age=0}
//调用私有方法
Method showNation = clazz.getDeclaredMethod("showNation", String.class);
showNation.setAccessible(true);
String nation = (String) showNation.invoke(p1,"China");//我的国籍是:China
System.out.println(nation);//China
}
}
java.lang.Class理解
使用ClassLoader加载配置文件
@Test
public void test3() throws Exception {
Properties pros = new Properties();
//此时的文件在当前的module下
//读取配置文件方式1:
// FileInputStream fis = new FileInputStream("jdbc.properties");
// pros.load(fis);
//此时的文件在module的src下
//读取配置文件方式2:
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 + ":" + password);
}
创建运行时类对象
@Test
public void test1() throws InstantiationException, IllegalAccessException {
Class<Person> clazz = Person.class;
/*
newInstance(): 调用此方法,创建对应的运行时类的对象,内部调用了运行时类的空参构造器
要想此方法正常的创建运行时类的对象,要求:
1.运行时类必须提供空参的构造器
2.空参的构造器的访问权限得够
在javabean中要求提供一个public的空参构造器
1.便于通过反射,创建运行时类的对象
2.便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器
*/
Person obj = clazz.newInstance();
System.out.println(obj);
}
反射动态性
@Test
public void test2(){
int num = new Random().nextInt(3);//0 1 2
String classPath = "";
switch (num){
case 0:
classPath = "java.util.Date";
break;
case 1:
classPath = "java.lang.Object";
break;
case 2:
classPath = "File.Person";
break;
}
try {
Object obj = getInstance(classPath);
System.out.println(obj);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
/*
* 此方法创建一个指定类的对象
* classPath:指定类的全类名
* */
public Object getInstance(String classPath) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Class<?> clazz = Class.forName(classPath);
return clazz.newInstance();
}