Java反射

写在前面的话:

  1. 参考资料:尚硅谷视频
  2. 本章内容:如何获取Class实例、3种类加载器、如何通过反射创建对象
  3. IDE:eclipse
  4. JDK:Java8

目录

1.获取Class的实例

1.1 直接将类名赋给Class

1.2 通过运行时类获取

1.3 通过调用forName()方法获取

1.4 通过类加载器

2.类加载器

3.通过反射来创建对象


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.类加载器

  1. 引导类加载器
  2. 扩展类加载器(平台类加载器)PlatformClassLoader
  3. 系统类加载器  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步:

  1. 获取Class类的实例(有4种[前面有提到],选择其中一种即可)
  2. 通过Class类的实例获取构造器(无参与有参都可以获取)
  3. 通过构造器创建对象

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 + "]";
	}
}

运行截图:

 

 完

 

posted @ 2022-04-16 21:13  辰梦starDream  阅读(1)  评论(0编辑  收藏  举报  来源