标签分类
技术文章
当前位置:主页 > 计算机编程 > java > Java中通过Class类获取Class对象的方法详解

Java中通过Class类获取Class对象的实例方法

  • 发布时间:
  • 作者:码农之家原创
  • 点击:138

Java中通过Class类获取Class对象的方法详解

这篇文章主要知识点是关于java,获取class对象,java,class对象,通过class获取对象,Java中通过Class类获取Class对象的方法详解,浅谈Java中的class类 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Java工程师修炼之道
  • 类型:Java大小:87.17 MB格式:PDF出版:电子工业出版社作者:杭建
立即下载
Java Web开发实例大全:基础卷
  • 类型:Java大小:175.2 MB格式:PDF出版:清华大学出版社作者:清华大学出版社
立即下载

更多相关的学习资源可以参阅 程序设计电子书Java电子书、等栏目。

前言

本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

阅读API的Class类得知,Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的

获取Class对象的三种方式(实例采用Person类)

方式1:通过Object类的getObject()方法   

Person p = new Person();
Class c = p.getClass();

方式2: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单)。

Class c2 = Person.class;

方式3: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。  

Class c3 = Class.forName("Person");

注意:第三种和前两种的区别

前两种你必须明确Person类型.

后面是指定这种类型的字符串就行.这种扩展更强.我不需要知道类名.我只提供字符串,按照配置文件加载就可以了

代码演示:

public class ReflectDemo {
 public static void main(String[] args) throws ClassNotFoundException {
  //通过Object类的getObject()方法   
  Person p = new Person();
  Class c1 = p.getClass();
  System.out.println(c1);
   
  //类名.class 获取到字节码文件对象
  Class c2 =Person.class;
  System.out.println(c2);
   
  //通过Class类中的方法forName()
  Class c3 = Class.forName("cn.shiqi.demo1.Person");
  System.out.println(c3);
 }
}
class Person{
 
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。

浅谈Java中的class类

Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象。

以下示例使用 Class 对象显示一个对象的 Class 名:

void printClassName(Object obj) {
System.out.println("The class of " + obj + " is " + obj.getClass().getName()); }

我们都知道所有的java类都是继承了object这个类,在object这个类中有一个方法:getclass().这个方法是用来取得该类已经被实例化了的对象的该类的引用,这个引用指向的是Class类的对象(呵呵,有点别扭)。我们自己无法生成一个Class对象(构造函数为private),而这个Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象,或通过类装载器中的 defineClass 方法生成。 我们生成的对象都会有个字段记录该对象所属类在CLass类的对象的所在位置。如下图所示:

浅谈Java中的class类

我们可以把每个Class类的对象当做众多类的代理。而且在每个Class类对象中有会有字段记录他引用的这个类的类加载器。如果该字段为null,表示该类的加载器为bootstrap loader.具体原因见我之前分享过的一篇“《ClassLoader工作机制 》”一文。

浅谈Java中的class类

我们知道java中有多个加载器,每个加载器能载入多个类,所以只要取得Class类对象,就可利用其getClassLoader()方法取得该类加载器的引用。

jvm为每种类管理者独一的Class对象。因此我们可以用双等号操作符来比较对象:a1.getClass()==A.class;应该返回的是true。

forName(String classname)和 forName(Stringclassname,{*}boolean initialze,*ClassLoader *loader)*方法。

该方法返回给定串名相应的Class对象。若给定一个类或接口的完整路径名,那么此方法将试图定位、装载和连接该类。若成功,返回该类对象。否则,抛出ClassNotFoundException异常。例如,下面代码段返回名为java.lang.Thread的运行Class描述器。Classt=Class.forName("java.lang.Thread");此方法是需要指定类加载器的,当用到仅有一个String参数的forName方法时,Class对象将默认调用当前类加载器作为加载器和将第二参数为true。第二个参数说明:如果是false时,调用forName方法只是在命令类加载器载入该类,而不初始化该类的静态区块,只有当该类第一次实例化时,静态区块才被调用。当为true时,则载入时就调用静态区块。

getClassLoader()

获取该类的类装载器。

getComponentType()

如果当前类表示一个数组,则返回表示该数组组件的Class对象,否则返回null。

getConstructor(Class[])

返回当前Class对象表示的类的指定的公有构造子对象。

getConstructors()

返回当前Class对象表示的类的所有公有构造子对象数组。

getDeclaredConstructor(Class[])

返回当前Class对象表示的类的指定已说明的一个构造子对象。

getDeclaredConstructors()

返回当前Class对象表示的类的所有已说明的构造子对象数组。

getDeclaredField(String)

返回当前Class对象表示的类或接口的指定已说明的一个域对象。

getDeclaredFields()

返回当前Class对象表示的类或接口的所有已说明的域对象数组。

getDeclaredMethod(String,Class[])

返回当前Class对象表示的类或接口的指定已说明的一个方法对象。

getDeclaredMethods()

返回Class对象表示的类或接口的所有已说明的方法数组。

getField(String)

返回当前Class对象表示的类或接口的指定的公有成员域对象。

getFields()

返回当前Class对象表示的类或接口的所有可访问的公有域对象数组。

getInterfaces()

返回当前对象表示的类或接口实现的接口。

getMethod(String,Class[])

返回当前Class对象表示的类或接口的指定的公有成员方法对象。

getMethods()

返回当前Class对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。

getModifiers()

返回该类或接口的Java语言修改器代码。

getName()

返回Class对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。

getResource(String)

按指定名查找资源。

getResourceAsStream(String)

用给定名查找资源。

getSigners()

获取类标记。

getSuperclass()

如果此对象表示除Object外的任一类,那么返回此对象的父类对象。

isArray()

如果Class对象表示一个数组则返回true,否则返回false。

isAssignableFrom(Class)

判定Class对象表示的类或接口是否同参数指定的Class表示的类或接口相同,或是其父类。

isInstance(Object)

此方法是Java语言instanceof操作的动态等价方法。

isInterface()

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

isPrimitive()

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

newInstance()

创建类的新实例。

toString()

将对象转换为字符串。

总结

以上就是本文关于浅谈Java中的class类的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到vue项目中使用md5加密以及、 儿童python编程入门书籍推、 解决axios.interceptors.respon、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:Java获取时间差实例代码详解

下一篇:Java用POI解析excel并获取所有单元格数据的方法整理

展开 +

收起 -

学习笔记
网友NO.761981

Java class文件格式之数据类型_动力节点Java学院整理

CONSTANT_Integer_info 一个常量池中的CONSTANT_Integer_info数据项, 可以看做是CONSTANT_Integer类型的一个实例。 它存储的是源文件中出现的int型数据的值。 同样, 作为常量池中的一种数据类型, 它的第一个字节也是一个tag值, 它的tag值为3, 也就是说, 当虚拟机读到一个tag值为3的数据项时, 就知道这个数据项是一个CONSTANT_Integer_info, 它存储的是int型数值的值。 紧挨着tag的下面4个字节叫做bytes, 就是int型数值的整型值。 它的内存布局如下: 下面以示例代码进行说明, 示例代码如下: package com.bjpowernode.test; public class TestInt { void printInt(){ System.out.println(65535); } } 将上面的类生成的class文件反编译: 1.D:\Workspace\AndroidWorkspace\BlogTest\binjavap-v-c-classpath.com.bjpowernode.test.TestInt 下面列出反编译的结果, 由于反编译结果较长, 我们省略了大部分信息: .................. .................. Constant pool: .................. .................. #21 = Integer 65535 .................. .................. { .................. .................. void printInt(); flags: Code: stack=2, locals=1, args_size=1 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #21 // int 65535 5: invokevirtual #22 // Method java/io/PrintStream.println:(I)V 8: return LineNumberTable: line 6: 0 line 7: 8 LocalVariableTable: Start Length Slot Name Signature 0 9 0 this Lcom/……

网友NO.795022

JavaScript之class继承_动力节点Java学院整理

JavaScript的对象模型是基于原型实现的,特点是简单,缺点是理解起来比传统的类-实例模型要困难,最大的缺点是继承的实现需要编写大量代码,并且需要正确实现原型链。 有没有更简单的写法?有! 新的关键字 class 从ES6开始正式被引入到JavaScript中。 class 的目的就是让定义类更简单。 我们先回顾用函数实现Student的方法: function Student(name) { this.name = name;}Student.prototype.hello = function () { alert('Hello, ' + this.name + '!');} 如果用新的 class 关键字来编写 Student ,可以这样写: class Student { constructor(name) { this.name = name; } hello() { alert('Hello, ' + this.name + '!'); }} 比较一下就可以发现, class 的定义包含了构造函数 constructor 和定义在原型对象上的函数 hello() (注意没有 function 关键字),这样就避免了 Student.prototype.hello = function () {...} 这样分散的代码。 最后,创建一个Student对象代码和前面章节完全一样: var xiaoming = new Student('小明');xiaoming.hello(); class继承 用class定义对象的另一个巨大的好处是继承更方便了。想一想我们从 Student 派生一个 PrimaryStudent 需要编写的代码量。现在,原型继承的中间对象,原型对象的构造函数等等都不需要考虑了,直接通过 extends 来实现: class PrimaryStudent extends Student { constructor(name, grade) { super(name); // 记得用super调用……

网友NO.201211

浅谈Java中的class类

Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象。 以下示例使用 Class 对象显示一个对象的 Class 名: void printClassName(Object obj) {System.out.println("The class of " + obj + " is " + obj.getClass().getName()); } 我们都知道所有的java类都是继承了object这个类,在object这个类中有一个方法:getclass().这个方法是用来取得该类已经被实例化了的对象的该类的引用,这个引用指向的是Class类的对象(呵呵,有点别扭)。我们自己无法生成一个Class对象(构造函数为private),而这个Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象,或通过类装载器中的 defineClass 方法生成。 我们生成的对象都会有个字段记录该对象所属类在CLass类的对象的所在位置。如下图所示: 我们可以把每个Class类的对象当做众多类的代理。而且在每个Class类对象中有会有字段记录他引用的这个类的类加载器。如果该字段为null,表示该类……

网友NO.991210

Java 使用getClass().getResourceAsStream()方法获取资源

Java 使用getClass().getResourceAsStream()方法获取资源 之前想获取一个资源文件做一些处理,使用getClass().getResourceAsStream()一直拿不到文件。 具体的用法。 1 InputStream is = this.getClass().getResourceAsStream(fileName); //拿不到资源2 InputStream is = this.getClass().getResourceAsStream("/" + fileName); // 拿到资源3 InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName); //拿到资源 具体文件和代码的位置是,代码在src/main/java目录下,资源文件在src/main/resources/目录下。 会从当前类的目录下去找,这个文件如果不和该类在一个目录下,就找不到。 会从编译后的整个classes目录下去找,maven也会把资源文件打包进classes文件夹,所以可以找到。 ClassLoader就是从整个classes文件夹找的,所以前面无需再加/。 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! ……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明