Java基础 -> 反射(创建实例)

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 {}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值