자바 클래스와 클래스 로딩 메커니즘

다음과 같은 측면에 초점을 맞추고 (자바의 클래스 로딩 메커니즘을 이해하는 클래스 수준의 이해, 클래스로드를 실시 클래스 로더를 사용하는 방법을 배우게)

클래스 클래스를 이해 (1)

각 클래스의 경우, JRE는 대한 일정한 유형의 Class 객체를 유지합니다. 클래스 객체는 특정 클래스에 대한 정보가 포함되어 있습니다.

  Class 오브젝트 만 대상 시스템에 의해 설립 할 수있다

     JVM의 클래스는 클래스의 인스턴스가 될 것입니다

    클래스의 각 인스턴스는 클래스의 인스턴스에 의해 생성된다 기억되는

    1 :  어떤 종류인가?

      클래스는 클래스 :(이다 클래스는 클래스의 이름을 나타냅니다 대문자 / 소문자 클래스 표현 클래스 타입입니다 )
공공 클래스 ReflectionTest {  @Test 공공 무효 의 TestClass () {클래스 clazz에 = 널 (null) ; }} // 클래스的定义공공 최종 클래스 클래스 <T> 를 구현 java.io.Serializable을, java.lang.reflect.GenericDeclaration, java.lang.reflect.Type, java.lang.reflect.AnnotatedElement {....}
    

2 : 어떤 정보 클래스이 클래스 캡슐화?

  클래스 현재 개체 클래스에 해당하는 정보를 캡슐화하는 클래스
  , 클래스가 예를 들어 속성, 메서드 및 다른 구성을 가지고, Person 클래스, 주문 클래스, 클래스 도서, 서로 다른 클래스는 (1) 지금 우리가 클래스 인 클래스를 설명하는 데 사용하는 클래스를 필요는 같은 클래스 이름, 특성, 방법, 구조 또는이 있어야합니다. 클래스 클래스는 클래스를 설명하는 데 사용되는

  2 급 클래스 오브젝트의 거울의 결과, 대상이되는 등 어떤 구현들은 속성에있어서, 생성자, 인터페이스를 볼 수있다

      관련 카테고리별로 3. JRE를위한 일정한 종류의 클래스 오브젝트를 유지한다. 클래스 객체는 특정 클래스에 대한 정보가 포함되어 있습니다.
    4.Class 객체 만 시스템 개체에 의해 설립 될 수 있고, JVM의 클래스 (아닌 개체) 클래스의 인스턴스 것

 

패키지 반영; 

공용  클래스 사람 { 
    문자열 이름; 
    개인  INT의 시대;
    공공 문자열 getName () {
         반환 이름; 
    } 
    공공  무효 에서는 setName (문자열 이름) {
          .name을 = 이름; 
    } 
    공공  INT getAge () {
         반환 시대; 
    } 
    공공  무효 setAge ( INT의 연령) {
          .age = 나이; 
    } 
    공공 사람 (문자열 이름, INT 세) {
        슈퍼 ();
         .name을 = 이름;
         .age = 나이; 
    } 
    공공 사람 () {
         슈퍼 (); 
        
    } 
    
    
}
그것은 사람의 유형을 정의

 

클래스 클래스 객체 클래스를 돌려

 

공용  클래스 ReflectionTest { 
    @Test 
    공개  공극 의 TestClass () { 
       클래스를 clazz = ; 
       
       // 1 클래스 개체 수득 
       를 clazz = 사람. 클래스 ] 
       
       에서 System.out.println ();   // 중단 삽입 
    } 
}

 

중단 점에서, 당신은 클래스에 포함 된 이미지 정보를 볼 수 있습니다

 

 

 마찬가지로, 이러한 특성의 값을 얻을 수있다

public class ReflectionTest {
    @Test
    public void testClass() {
       Class clazz = null;
       
       //1.得到Class对象
       clazz = Person.class;
       //2.返回字段的数组
       Field[] fields = clazz.getDeclaredFields();
       
       System.out.println();  //插入断点
    }
}

查看fields的内容

 

 

 对象为什么需要照镜子呢?

    1. 有可能这个对象是别人传过来的

    2. 有可能没有对象,只有一个全类名 

  通过反射,可以得到这个类里面的信息

获取Class对象的三种方式

  1.通过类名获取      类名.class    

  2.通过对象获取      对象名.getClass()

  3.通过全类名获取    Class.forName(全类名)

 

 

public class ReflectionTest {
  @Test
  public  void testClass() throws ClassNotFoundException{
      Class clazz=null;
      //1、通过类名获取对象    类名.class
      clazz=Person.class;
      Field[] filed=clazz.getDeclaredFields();
      Field[] fields=clazz.getFields();
      System.out.println(Arrays.deepToString(filed));
      System.out.println(Arrays.deepToString(fields));
      //2、通过对象名
      //这种方式是用在传进来一个对象,却不知道对象的类型时候用
      Person person=new Person();
      clazz=person.getClass();
      Object obj=new Person();
      clazz=obj.getClass();
      //3、通过全类名(会抛出异常)
      String  classname="reflect.Person";
      clazz=Class.forName(classname);
      
      //字符串的例子
      clazz=String.class;
      clazz="javaTest".getClass();
      clazz=Class.forName("java.lang.String");
      System.out.println();
      
  }

Class类的常用方法

 

方法名

功能说明

static Class forName(String name)

返回指定类名 name 的 Class 对象

Object newInstance()

调用缺省构造函数,返回该Class对象的一个实例

Object newInstance(Object []args)

调用当前格式构造函数,返回该Class对象的一个实例

getName()

返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称

Class getSuperClass()

返回当前Class对象的父类的Class对象

Class [] getInterfaces()

获取当前Class对象的接口

ClassLoader getClassLoader()

返回该类的类加载器

Class getSuperclass()

返回表示此Class所表示的实体的超类的Class

 

 Class类的newInstance()方法

@Test
  public void testNewInstance() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
      //1、获取Class对象
      String className="reflect.Person";
      Class clazz=Class.forName(className);
      //利用class对象的newInstance方法创建一个类的实例
      Object obj=clazz.newInstance();
      System.out.println(obj);
  }

     可以看出确实是创建了一个Person实例
  但是Person类有两个构造方法,到底是调用的哪一个构造方法呢

  实际调用的是类的无参数的构造器。所以在我们在定义一个类的时候,定义一个有参数的构造器,作用是对属性进行初始化,还要写一个无参数的构造器,作用就是反射时候用。

  一般地、一个类若声明一个带参的构造器,同时要声明一个无参数的构造器

 

2.ClassLoader

类装载器是用来把类(class)装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示

 

 

 

 @Test
  public void testClassLoader() throws ClassNotFoundException{
      //1、获取一个系统的类加载器(可以获取,当前这个类ReflecTest就是它加载的)
    ClassLoader classLoader=ClassLoader.getSystemClassLoader();
    System.out.println(classLoader);
     //2、获取系统加载器的父类加载器(扩展器加载器,可以获取)
    classLoader=classLoader.getParent();
    System.out.println(classLoader);
    //3、获取扩展类加载器的父类加载器(引导加载器,不可以获取)
    classLoader=classLoader.getParent();
    System.out.println(classLoader);
    //4、测试当前类用哪个类加载器进行加载(系统类加载器)
    classLoader=Class.forName("reflect.ReflectionTest").getClassLoader();
    System.out.println(classLoader);
   //5、测试JDK提供的Object类由哪个类加载器负责加载(引导类)
    classLoader=Class.forName("java.lang.Object").getClassLoader();
    System.out.println(classLoader);
}

使用类加载器获取当前类目录下的文件

 

 

 首先,系统类加载器可以加载当前项目src目录下面的所有类,如果文件也放在src下面,也可以用类加载器来加载

调用 getResourceAsStream 获取类路径下的文件对应的输入流.

 

 

 @Test
  public void testClassLoader() throws ClassNotFoundException{
     /* //1、获取一个系统的类加载器(可以获取,当前这个类ReflecTest就是它加载的)
    ClassLoader classLoader=ClassLoader.getSystemClassLoader();
    System.out.println(classLoader);
     //2、获取系统加载器的父类加载器(扩展器加载器,可以获取)
    classLoader=classLoader.getParent();
    System.out.println(classLoader);
    //3、获取扩展类加载器的父类加载器(引导加载器,不可以获取)
    classLoader=classLoader.getParent();
    System.out.println(classLoader);
    //4、测试当前类用哪个类加载器进行加载(系统类加载器)
    classLoader=Class.forName("reflect.ReflectionTest").getClassLoader();
    System.out.println(classLoader);
   //5、测试JDK提供的Object类由哪个类加载器负责加载(引导类)
    classLoader=Class.forName("java.lang.Object").getClassLoader();
    System.out.println(classLoader);*/
    
   //src目录下直接加载
    InputStream in1=null;
    in1=this.getClass().getResourceAsStream("text1.txt");
    //放在内部文件夹,要写全路径
    InputStream in2=this.getClass().getResourceAsStream("reflect/text2.txt");
    }

参考:https://www.cnblogs.com/zhaozw/p/10857841.html

추천

출처www.cnblogs.com/zouhong/p/12103548.html