测试中需要用到的代码

InterfaceA代码:

package jichu;

interface InterfaceA {
String s1 = "this is s1 in InterfaceA"; public String method1();
}

ClassA代码:

package jichu;

public class ClassA {
private String s1 = "this is s1 in ClassA";
private String s2 = "this is s2 in ClassA"; public String method1() {
return "this is method1 in ClassA";
} public String method2() {
return "this is method2 in ClassA";
} class Inner {
private String s1 = "this is s1 in Inner"; private String method1() {
return "this is method1 in Inner";
}
}
}

ClassB代码:

package jichu;

public class ClassB {
}

Class类

位置:java.lang包中

声明:public final class Class<T>implements java.io.Serializable, java.lang.reflect.GenericDeclaration,java.lang.reflect.Type,java.lang.reflect.AnnotatedElement

class 类有final 修饰,可知他不能被子类继承;并且它实现了多个接口。

类型参数:T - 由此 Class 对象建模的类的类型。例如,String.class 的类型是 Class<String>。如果将被建模的类未知,则使用 Class<?>。

介绍:Class是一个java中的泛型类型。Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

字段

    private static final int ANNOTATION= 0x00002000;
private static final int ENUM = 0x00004000;
private static final int SYNTHETIC = 0x00001000;

构造器

    private Class() {}

构造器是私有的,可知不能通过new创建Class对象。

如何得到Class类的实例?

Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

getName方法

public String getName()

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

如果此类对象表示一个基本类型或 void,则返回的名字是一个与该基本类型或 void 所对应的 Java 语言关键字相同的String。

如果此类对象表示一个数组类,则名字的内部形式为:表示该数组嵌套深度的一个或多个 '[' 字符加元素类型名。元素类型名的编码如下:

类型 编码
boolean  Z
byte  B
char  C
class or interface  L  classname
double  D
float  F
int  I
long  J
short  S

toString方法

public String toString()

重写了Object类的toString方法。

    public String toString() {
return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
+ getName();
}

如果是接口,则返回"interface "+getName();否则如果是基本类型,则返回getName();否则返回"class "+getName()。

测试:

        Class c1 = ClassA.class;
System.out.println(c1.toString());// class jichu.ClassA
Class c2 = InterfaceA.class;
System.out.println(c2.toString());// interface jichu.InterfaceA
Class c3 = int.class;
System.out.println(c3.toString());// int
Class c4 = int[].class;
System.out.println(c4.toString());// class [I
Class c5 = void.class;
System.out.println(c5.toString());// void
Class c6 = (new ClassA().new Inner()).getClass();
System.out.println(c6.toString());// class jichu.ClassA$Inner

获取Class对象

forName(String className)

public static Class<?> forName(String className)

返回与带有给定字符串名的类或接口相关联的 Class 对象。

注意:字符串名必须是全限定名。

测试:

        Class c = Class.forName("jichu.ClassA");
System.out.println(c.toString());// class jichu.ClassA

forName(String name, boolean initialize,ClassLoader loader)

public static Class<?> forName(String name, boolean initialize,ClassLoader loader)throws ClassNotFoundException

上一个方法的重载方法,可以指定类名称、加载时是否运行静态区块、指定类加载器。

类字面值

        Class c = ClassA.class;
System.out.println(c1.toString());// class jichu.ClassA

Object中的getClass()

        ClassA c = new ClassA();
System.out.println(c.getClass().toString());// class jichu.ClassA 

判断型方法

public native boolean isInstance(Object obj);

判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。此方法是 Java 语言 instanceof 运算符的动态等效方法。

public native boolean isArray();

判定此 Class 对象是否表示一个数组类。

public native boolean isPrimitive();

判定指定的 Class 对象是否表示一个基本类型。

public native boolean isInterface();

判定指定的 Class 对象是否表示一个接口类型。

public boolean isMemberClass();

当且仅当底层类是成员类时返回 true。

测试:

        Class c1 = ClassA.class;
System.out.println(c1.isInstance(new ClassA()));// true
System.out.println(c1.isInstance(new ClassB()));// false
Class c2 = InterfaceA.class;
System.out.println(c2.isInterface());// true
Class c3 = int.class;
System.out.println(c3.isPrimitive());// true
Class c4 = int[].class;
System.out.println(c4.isArray());// true
Class c5 = void.class;
System.out.println(c5.isPrimitive());// true
Class c6 = (new ClassA().new Inner()).getClass();
System.out.println(c6.isMemberClass());// true

获取类型信息

获取包名

public Package getPackage()

返回该类的包,如果存档或基本代码中没有可用的包信息,则返回 null。

测试:

        Class c1 = ClassA.class;
Class c2 = int.class;
System.out.println(c1.getPackage());// package jichu
System.out.println(c2.getPackage());// null

获取超类

public native Class<? super T> getSuperclass();

此对象所表示的类的超类。

测试:

        Class c = ClassA.class;
System.out.println(c.getSuperclass());// class java.lang.Object

获取修饰符

public native int getModifiers();

表示该类修饰符的 int值。

测试:

        Class c1 = Class.forName("jichu.ClassA");
Class c2 = Class.forName("jichu.InterfaceA");
int[] arr = new int[] {};
Class c3 = arr.getClass();
System.out.println(c1.getModifiers());//
System.out.println(c2.getModifiers());//
System.out.println(c3.getModifiers());//

将返回的int值转换成修饰符:

        System.out.println(Modifier.toString(c1.getModifiers()));// public
System.out.println(Modifier.toString(c2.getModifiers()));// abstract interface
System.out.println(Modifier.toString(c3.getModifiers()));// public abstract final

获取非限定类名

public String getSimpleName();

返回源代码中给出的底层类的简称。如果底层类是匿名的则返回一个空字符串。数组的简称即附带 "[]" 的组件类型的简称。

测试:

        Class c1 = ClassA.class;
Class c2 = InterfaceA.class;
Class c3 = int.class;
Class c4 = int[].class;
Class c5 = void.class;
System.out.println(c1.getSimpleName());// ClassA
System.out.println(c2.getSimpleName());// InterfaceA
System.out.println(c3.getSimpleName());// int
System.out.println(c4.getSimpleName());// int[]
System.out.println(c5.getSimpleName());// void

获取全限定类名

public String getCanonicalName();

返回 Java Language Specification 中所定义的底层类的规范化名称。如果底层类没有规范化名称(即如果底层类是一个组件类型没有规范化名称的本地类、匿名类或数组),则返回 null。

测试:

        Class c1 = ClassA.class;
Class c2 = InterfaceA.class;
Class c3 = int.class;
Class c4 = int[].class;
Class c5 = void.class;
System.out.println(c1.getCanonicalName());//jichu.ClassA
System.out.println(c2.getCanonicalName());// jichu.InterfaceA
System.out.println(c3.getCanonicalName());// int
System.out.println(c4.getCanonicalName());// int[]
System.out.println(c5.getCanonicalName());// void

获取所有成员变量

public Field[] getDeclaredFields() throws SecurityException

返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

测试:

        Class c = Class.forName("jichu.ClassA");
Field[] arr = c.getDeclaredFields();
StringBuffer s = new StringBuffer();
for (Field f : arr) {
s.append(Modifier.toString(f.getModifiers()) + " ");
s.append(f.getType().getSimpleName() + " ");
s.append(f.getName() + ";\n");
}
System.out.println(s.toString());

打印:

private String s1;
private String s2;

获取指定名称的成员变量

public Field getDeclaredField(String name)throws NoSuchFieldException, SecurityException

返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称。注意,此方法不反映数组类的 length 字段。

测试:

        Class c = Class.forName("jichu.ClassA");
Field f = c.getDeclaredField("s2");
StringBuffer s = new StringBuffer();
s.append(Modifier.toString(f.getModifiers()) + " ");
s.append(f.getType().getSimpleName() + " ");
s.append(f.getName() + ";\n");
System.out.println(s.toString());

打印:

private String s2;

获取所有成员方法

public Method[] getDeclaredMethods() throws SecurityException

返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

测试:

        Class c = Class.forName("jichu.ClassA");
Method[] arr = c.getDeclaredMethods();
StringBuffer s = new StringBuffer();
for (Method m : arr) {
s.append(Modifier.toString(m.getModifiers()) + " ");
s.append(m.getReturnType().getSimpleName() + " ");
s.append(m.getName() + ";\n");
}
System.out.println(s.toString());

打印:

public String method1;
public String method2;

获取指定名称的成员方法

public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException

返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。name 参数是一个 String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识该方法的形参类型。如果在某个类中声明了带有相同参数类型的多个方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则返回该方法;否则将从中任选一个方法。

测试:

        Class c = Class.forName("jichu.ClassA");
Method m = c.getDeclaredMethod("method1");
StringBuffer s = new StringBuffer();
s.append(Modifier.toString(m.getModifiers()) + " ");
s.append(m.getReturnType().getSimpleName() + " ");
s.append(m.getName() + ";\n");
System.out.println(s.toString());

打印:

public String method1;

 

创建实例

public T newInstance() throws InstantiationException, IllegalAccessException

创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。

测试:

        Class c = Class.forName("jichu.ClassA");
ClassA o1 = (ClassA) c.newInstance();
ClassA o2 = (ClassA) c.newInstance();
System.out.println(o1.method1());// this is method1 in ClassA
System.out.println(o1 == o2);// false

 

java之Class类详解的更多相关文章

  1. java之StringBuffer类详解

    StringBuffer 线程安全的可变字符序列. StringBuffer源码分析(JDK1.6): public final class StringBuffer extends Abstract ...

  2. java之AbstractStringBuilder类详解

    目录 AbstractStringBuilder类 字段 构造器 方法   public abstract String toString() 扩充容量 void  expandCapacity(in ...

  3. java之StringBuilder类详解

    StringBuilder 非线程安全的可变字符序列 .该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在 ...

  4. java.lang.Thread类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

  5. Java中dimension类详解

    Java中dimension类详解 https://blog.csdn.net/hrw1234567890/article/details/81217788

  6. java之Matcher类详解

    在JDK 1.4中,Java增加了对正则表达式的支持. java与正则相关的工具主要在java.util.regex包中:此包中主要有两个类:Pattern.Matcher. Matcher  声明: ...

  7. java的ReentrantLock类详解

    ReentrantLock 能用于更精细化的加锁的Java类, 通过它能更清楚了解Java的锁机制 ReentrantLock 类的集成关系有点复杂, 既有内部类, 还有多重继承关系 类的定义 pub ...

  8. Java的String类详解

    Java的String类 String类是除了Java的基本类型之外用的最多的类, 甚至用的比基本类型还多. 同样jdk中对Java类也有很多的优化 类的定义 public final class S ...

  9. Java Properties工具类详解

    1.Java Properties工具类位于java.util.Properties,该工具类的使用极其简单方便.首先该类是继承自 Hashtable<Object,Object> 这就奠 ...

  10. Java中ArrayList类详解

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

随机推荐

  1. iOS:缓存与Operation优先级问题

    这篇博客来源于今年的一个面试题,当我们使用SDWebImgae框架中的sd_setImageWithURL: placeholderImage:方法在tableView或者collectionView ...

  2. neo4j安装与示例

    Neo4j有两种访问模式:服务器模式和嵌入模式参考,下面主要讲windows下这两种模式的配置与访问示例 1 Windows下Neo4j服务器模式安装与示例 安装: 1.下载Neo4j,我下载的版本是 ...

  3. c++中两个类互相引用的问题

    最近在改一个C++程序的时候碰到一条警告信息,警告信息为:“ 删除指向不完整“Q2DTorusNode”类型的指针:没有调用析构函数                1> c:\users\lxw ...

  4. tengine-2.1.0 + GraphicsMagick-1.3.20

    export LUAJIT_LIB=/usr/local/libexport LUAJIT_INC=/usr/local/include/luajit-2.0/./configure --prefix ...

  5. 暴力清除Android中的短信

    有些短信程序有bug,当短信(特别是彩信)没有接收完整,或者是一些异常情况下,你会收到一条短信但是看不到或者看不了. 此时郁闷的事情就来了,系统会提醒你还有1条未读短信,但是你满世界都找不到这条短信. ...

  6. Maven进价:Maven的安装和目录结构

    一.在windows上安装Maven 1.下载 下载地址:http://maven.apache.org/download.html 下载最新版本 maven3.2.5 2.解压 解压地址:F:\Ja ...

  7. client/scroll/offset width/height/top/left ---记第一篇博客

    client/scroll/offset width/height/top/left (盒模型为contentBox,定位原点是元素左上角边框最外层的交点) clientWidth  width+左p ...

  8. 伸展树(一)之 图文解析 和 C语言的实现

    概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...

  9. 【Git】基本命令使用

    init: 1 git init 添加远程分支: 1 git remote add <远程主机名>  <远程主机地址url> 例如:git remote add origin  ...

  10. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...