Java中Class类事情道理详解
当前位置:以往代写 > JAVA 教程 >Java中Class类事情道理详解
2019-06-14

Java中Class类事情道理详解

Java中Class类事情道理详解

副标题#e#

1.Class工具

Class工具包括了与类相关的信息。事实上,Class工具就是用来建设类的所有的“普通”工具的。

类是措施的一部门,每个类都有一个Class工具。换言之,每当编写而且编译了一个新类,就会发生一个Class工具(恰内地说,是被生存在一个同名的.class文件中)。在运行时,当我们想生成这个类的工具时,运行这个措施的Java虚拟机(JVM)首先查抄这个类的Class工具是否已经加载。假如尚未加载,JVM就会按照类名查找.class文件,并将其载入。

一旦某个类的Class工具被载入内存,它就被用来建设这个类的所有工具。看下面示例。

SweetShop.java

package com.zj.sample;
class Candy {
  static {
    System.out.println("Loading Candy");
  }
}
class Gum {
  static {
    System.out.println("Loading Gum");
  }
}
class Cookie {
  static {
    System.out.println("Loading Cookie");
  }
}
public class SweetShop {
  public static void main(String[] args) {
    System.out.println("inside main");
    new Candy();
    System.out.println("After creating Candy");
    try {
      Class.forName("com.zj.sample.Gum");
    } catch (ClassNotFoundException e) {
      System.out.println("Couldn't find Gum");
    }
    System.out.println("After Class.forName(\"Gum\")");
    new Cookie();
    System.out.println("After creating Cookie");
  }
}

功效:

inside main

Loading Candy

After creating Candy

Loading Gum

After Class.forName("Gum")

Loading Cookie

After creating Cookie


#p#副标题#e#

2.获取Class实例的三种方法

1)操作工具挪用getClass()要领获取该工具的Class实例。

2)利用Class类的静态要领forName(),用类的名字获取一个Class实例。

3)运用.class的方法来获取Class实例,对付根基数据范例的封装类,还可以回收.TYPE来获取相对应的根基数据范例的Class实例。

3.Class.forName

上面的示例中:

Class.forName("com.zj.sample.Gum");

这个要领是Class类(所有Class工具都属于这个类)的一个static成员。Class工具就和其它工具一样,我们可以获取并操纵它的引用。forName()是取得Class工具的引用的一种要领。它是用一个包括方针类的文本名的String作输入参数,返回的是一个Class工具的引用。

4.类字面常量

Java还提供了另一种要领来生成对Class工具的引用,纵然用“类字面常量”。对上述措施来说,可以是:

com.zj.sample.Gum.class;

5.要害字instanceof

要害字instanceof返回一个布尔值,判定是不是某个特定范例的实例。

if(x instanceof Dog) ((Dog)x).bark();

6.获取Class实例

package com.zj.sample;
class Point {
  int x, y;
}
class ClassTest {
  public static void main(String[] args) {
    Point pt = new Point();
    Class c1 = pt.getClass();
    System.out.println(c1.getName());
    try {
      Class c2 = Class.forName("com.zj.sample.Point");
      System.out.println(c2.getName());
    } catch (Exception e) {
      e.printStackTrace();
    }
    Class c3 = Point.class;
    System.out.println(c3.getName());
    Class c4 = int.class;
    System.out.println(c4.getName());
    Class c5 = Integer.TYPE;
    System.out.println(c5.getName());
    Class c6 = Integer.class;
    System.out.println(c6.getName());
  }
}

功效:

com.zj.sample.Point

com.zj.sample.Point

com.zj.sample.Point

int

int

java.lang.Integer

#p#副标题#e#

7.Class的其他要领

1)Class.newInstance()利用所选的Class工具生成该类的新实例。它挪用了缺省(无参数)的类结构器生成新的工具。所以利用newInstance()建设的类必需有一个缺省结构器。对付newInstance()来说,可以在原先没有任何工具存在的环境下,利用它建设一个新的工具。

操作newInstance()实例化一个工具:

package com.zj.sample;
class Point {
  static {
    System.out.println("Loading Point");
  }
  int x, y;
}
class ClassTest {
  public static void main(String[] args) {
    try {
      Class c = Class.forName("com.zj.sample.Point");
      Point pt = (Point) c.newInstance();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

功效:

Loading Point

2)Class.isInstance()要领提供了一种动态地挪用instanceof运算符的途径。

3)Class.getInterfaces()要领返回Class工具的数组,这些工具代表的是某个Class工具所包括的接口。

#p#分页标题#e#

4)假如有一个Class工具,那么就可以通过getSuperclass()获取它的直接基类。这个要领自然也是返回一个Class引用,所以可以进一步查询其基类。这意味着在运行时,可以找到一个工具完整的类条理布局。

5)Class类支持反射的观念,Java附带的库java.lang.reflect包括了Field、Method以及Constructor类(每个类都实现了Member接口)。这些范例的工具是由JVM在运行时建设的,用以暗示未知类里对应的成员。这样可以利用Constructor建设新的工具,用get()和set()要领读取和修改与Field工具关联的字段,用invoke()要领挪用与Method工具关联的要领。别的,还可以挪用getFields()、getMethods、getConstrucotrs()要领,返回暗示字段、要领以及结构器的工具的数组。

#p#副标题#e#

8.操作反射API察看未知类的结构要领与要领

package com.zj.sample;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
class Point {
  static {
    System.out.println("Loading Point");
  }
  int x, y;
  void output() {
    System.out.println("x=" + x + "," + "y=" + y);
  }
  Point(int x, int y) {
    this.x = x;
    this.y = y;
  }
}
class ClassTest {
  public static void main(String[] args) {
   
    try {
      Class c = Class.forName("com.zj.sample.Point");
      Constructor[] cons = c.getDeclaredConstructors();
      for (int i = 0; i < cons.length; i++)// 返回所有声明的结构要领
      {
       System.out.println(cons[i]);
      }
      Method[] ms = c.getDeclaredMethods();
      for (int i = 0; i < ms.length; i++)// 返回所有声明的要领
      {
       System.out.println(ms[i]);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

功效:

Loading Point

com.zj.sample.Point(int,int)

void com.zj.sample.Point.output()

#p#副标题#e#

9.动态挪用一个类的实例(完全没有呈现point这个名字)

package com.zj.sample;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
class Point {
  static {
    System.out.println("Loading Point");
  }
  int x, y;
  void output() {
    System.out.println("x=" + x + "," + "y=" + y);
  }
  Point(int x, int y) {
    this.x = x;
    this.y = y;
  }
}
class ClassTest {
  public static void main(String[] args) {
   
    try {
      Class c = Class.forName("com.zj.sample.Point");
      Constructor[] cons = c.getDeclaredConstructors();
      Class[] params = cons[0].getParameterTypes();// 察看结构器的参数信息
      Object[] paramValues = new Object[params.length];// 构建数组通报参数
      for (int i = 0; i < params.length; i++) {
       if (params[i].isPrimitive())// 判定class工具暗示是否是根基数据范例
       {
         paramValues[i] = new Integer(i);
       }
      }
      Object o = cons[0].newInstance(paramValues);// 建设一个工具的实例
      Method[] ms = c.getDeclaredMethods();// 挪用要领
      ms[0].invoke(o, null);// 用指定的参数挪用(output要领没有参数,null)
    } catch (Exception e) {
      e.printStackTrace();
    }
 }
}

功效:

Loading Point

x=0,y=1

    关键字:

在线提交作业