package Test10月;
import org.junit.Test;
/**
* @author 罗德
* @date ${DATE} ${TIME}
* @version 1.0
*/
public class Test1001 {
/**
* 1.反射:可以调用其他类中private的方法,属性(正常是不可以的,封装性) 正常new,调方法,属性的步骤,反射都可以实现,且可以实现他们实现不了的功能
* 2.什么时候使用反射:在java程序已经运行了的时候,已经跑起来了的时候,代码已经不能变的时候,不能再new对象的时候
* 你想要注册,或者登陆了,你就需要new一个用户名-密码这样的新的对象,但是你已经跑起来了,就不能再new了
* 就出现了反射的方式,可以动态的(已经运行的程序)new对象,你需要注册,我就给你new一个注册对象,你要登陆我就new一个登陆的对象
*
* <p>java.lang.Class类 1.加载--编译:javac.exe--字节码文件(.class结尾)
* 运行:java.exe--对某个字节码文件解释运行,将字节码文件加载到内存中--类的加载 加载后的类就是运行时类,也就是Class类的实例
* (加载的类是Class类的实例,以前类造对象,现在类也是对象,是Class的对象,万物皆可对象)
*/
@Test
public void test() throws ClassNotFoundException {
// 获取Class实例的方式: 几乎所有的都可以.class(类,数组,接口,注解,枚举,基本数据类型等)得到Class对象
// 方式一:类.class
Class<TEST> testClass = TEST.class;
System.out.println(testClass); // class Test10月.TEST
// 方式二:new出的对象.getclass()
TEST test = new TEST();
Class<? extends TEST> testClass1 = test.getClass();
System.out.println(testClass1); // class Test10月.TEST
// 方式三:用Class的静态方法
// static 类<?> forName(String className)
// 返回与具有给定字符串名称的类或接口关联的 类对象。
Class<?> testClass2 = Class.forName("Test10月.TEST"); // 包名.类名
System.out.println(testClass2); // class Test10月.TEST
System.out.println(testClass == testClass1); // true
System.out.println(testClass == testClass2); // true
// 方式四:类的加载器,
// 在方式一上多加了点东西,看起来似乎比方式一更麻烦
// 当类还没有加载的时候采用这样的方法,还没有将类的.class文件加载到内存(编译是编译成.class文件)
ClassLoader classLoader = TEST.class.getClassLoader(); // 获取加载器(此时是系统加载器)
Class<?> loadClass = classLoader.loadClass("Test10月.TEST"); // 加载器获取本地类
System.out.println(loadClass); // class Test10月.TEST
System.out.println(testClass == loadClass); // true
// ClassLoader getParent()
// 返回委托的父类加载器。
ClassLoader classLoaderParent = classLoader.getParent();
// 系统加载器父类加载器是扩展加载器
// jdk.internal.loader.ClassLoaders$PlatformClassLoader@737996a0
System.out.println(classLoaderParent);
ClassLoader classLoaderParentParent = classLoaderParent.getParent();
// 最上层的应用加载器是无法获取的,是加载核心库的加载器
System.out.println(classLoaderParentParent); // null
}
}
/**
* @author 罗德
* @date ${DATE} ${TIME}
* @version 1.0
*/
class TEST {}
Java基础 -> 反射(创建实例)
于 2020-10-02 19:46:12 首次发布