Java反射
写在前面的话:
- 参考资料:尚硅谷视频
- 本章内容:如何获取Class实例、3种类加载器、如何通过反射创建对象
- IDE:eclipse
- JDK:Java8
目录
1.获取Class的实例
在这里介绍了4中方法
1.1 直接将类名赋给Class
//1.调用运行时类本身的.class属性
Class clazz1 = Person.class;
System.out.println(clazz1.getName());
1.2 通过运行时类获取
//2.通过运行时类的对象获取
Person p = new Person();
Class clazz2 = p.getClass();
System.out.println(clazz2.getName());
1.3 通过调用forName()方法获取
注意:采用此方式要抛出异常!
String className = "exer02.Person";
Class clazz3 = Class.forName(className);
System.out.println(clazz3.getName());
参数说明:forName(String str) 其中填入的字符串是该类的包名+类名
1.4 通过类加载器
ClassLoader classLoader = this.getClass().getClassLoader();
Class clazz4 = classLoader.loadClass(className);//exer02.Person
System.out.println(clazz4.getName());
2.类加载器
- 引导类加载器
- 扩展类加载器(平台类加载器)PlatformClassLoader
- 系统类加载器 AppClassLoader
通过代码来查看以下类加载器:
ClassLoader classLoader = this.getClass().getClassLoader();
System.out.println(classLoader);//结果:jdk.internal.loader.ClassLoaders$AppClassLoader@736e9adb
ClassLoader classLoader2 = classLoader.getParent();//获取父类
System.out.println(classLoader2);//结果:jdk.internal.loader.ClassLoaders$PlatformClassLoader@45f45fa1
ClassLoader classLoader3 = classLoader2.getParent();
System.out.println(classLoader3);//结果:null
根据结果,可以知道引导类加载器我们无法直接获取
3.通过反射来创建对象
一般来说,分为3步:
- 获取Class类的实例(有4种[前面有提到],选择其中一种即可)
- 通过Class类的实例获取构造器(无参与有参都可以获取)
- 通过构造器创建对象
TestConstructor.java
import java.lang.reflect.Constructor;
import org.junit.Test;
public class TestConstructor {
/*
* 创建运行时类
*/
@Test
public void test1() throws Exception {
String str = new String("exer03.Person");
//1.创建一个Class类
@SuppressWarnings("unchecked")
Class<Person> clazz = (Class<Person>) Class.forName(str);
//2.通过clazz创建构造器
Constructor<Person> constructor = clazz.getConstructor();
//3.通过构造器创建对象
Person p1 = constructor.newInstance();
System.out.println(p1);
}
}
代码中提到的Person类
Person.java
package exer03;
public class Person implements java.io.Serializable{
public static final long serialVersionUID = 1346518391879302182L;
private String name;
public Person() {
super();
}
public Person(String name) {
super();
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void show() {
System.out.println("我是Person类");
}
public void sum(int a, int b) {
System.out.println(a + b);
}
@Override
public String toString() {
return "Person [name=" + name + "]";
}
}
运行截图:
完